簡體   English   中英

在文件范圍內可變修改的數組

[英]Variably modified array at file scope

我想創建一個在我的Objective-C實現文件中使用的常量靜態數組,類似於我的“.m”文件的頂層。

static const int NUM_TYPES = 4;
static int types[NUM_TYPES] = { 
  1,
  2, 
  3, 
  4 };

我打算稍后在文件中使用NUM_TYPES ,所以我想把它放在一個變量中。

但是,當我這樣做時,我得到了錯誤

“在文件范圍內可變修改'類型'”

我認為這可能與數組大小是一個變量有關(當我在那里放一個整數文字時,我不會得到這個消息,比如static int types[4] )。

我想解決這個問題,但也許我說這一切都錯了......我在這里有兩個目標:

  1. 擁有一個可在整個文件中訪問的數組
  2. 要將NUM_TYPES封裝到變量中,因此我的文件中的不同位置沒有相同的文字

有什么建議?

[編輯]在C Faq中找到了這個: http//c-faq.com/ansi/constasconst.html

這種警告的原因是c中的const並不意味着常數。 這意味着“只讀”。 因此,該值存儲在內存地址中,可能會被機器代碼更改。

如果你打算使用預處理器,根據其他答案,那么你可以讓編譯器自動確定NUM_TYPES的值:

#define NUM_TYPES (sizeof types / sizeof types[0])
static int types[] = { 
  1,
  2, 
  3, 
  4 };
#define NUM_TYPES 4

也可以使用枚舉。

typedef enum {
    typeNo1 = 1,
    typeNo2,
    typeNo3,
    typeNo4,
    NumOfTypes = typeNo4
}  TypeOfSomething;

Imho這是許多c編譯器的缺陷。 我知道一個事實,我使用的編譯器不會在地址中存儲“靜態const”變量,而是用非常常量替換代碼中的用法。 這可以驗證,因為當您使用預處理器#define指令和使用靜態const變量時,您將獲得生成代碼的相同校驗和。

無論哪種方式,您應該盡可能使用靜態const變量而不是#defines,因為靜態const是類型安全的。

正如在其他答案中已經解釋的那樣,C中的const僅表示變量是只讀的。 它仍然是運行時值。 但是,您可以在C中使用enum作為實常數:

enum { NUM_TYPES = 4 };
static int types[NUM_TYPES] = { 
  1, 2, 3, 4
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM