文件范围内的可变修改数组

我想在我的“.m”文件的顶层创build一个常量静态数组,用于整个Objective-C实现文件,类似于这样的东西:

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

我打算在后面的文件中使用NUM_TYPES ,所以我想把它放在一个variables中。

但是,当我这样做,我得到的错误

在文件范围“可变修改”types“

我认为这可能与作为variables的数组大小有关(当我在那里放置一个整型文字时,我不会得到这个消息,就像static int types[4] )。

我想解决这个问题,但也许我错了……我在这里有两个目标:

  1. 有一个可以在整个文件中访问的数组
  2. 要将NUM_TYPES封装到一个variables中,所以我没有在文件中散布相同的文字

有什么build议么?

[编辑]在C常见问题中find这个: 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编译器的缺陷。 我知道这样一个事实,即我所使用的编译器不会在地址处存储“静态常量”variables,而是通过非常稳定的代码replace代码中的使用。 这可以validation,因为当您使用预处理程序#define指令以及使用静态常量variables时​​,您将获得与生成的代码相同的校验和。

无论哪种方式,你应该尽可能使用静态常量variables,而不是#define,因为静态常量是types安全的。

正如在其他答案中已经解释的那样,C中的const仅仅意味着一个variables是只读的。 这仍然是一个运行时间值。 但是,你可以使用一个enum作为一个真正的常量在C:

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