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

时间:2009-11-11 02:19:45

标签: c objective-c arrays static const

我想创建一个在我的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封装到变量中,因此我的文件中的不同位置没有相同的字面值
  3. 有什么建议吗?

    [编辑] 在C Faq:http://c-faq.com/ansi/constasconst.html

    中找到了这个

6 个答案:

答案 0 :(得分:60)

此警告的原因是const in c doesn't mean constant. It means "read only".因此该值存储在内存地址中,可能会被机器代码更改。

答案 1 :(得分:32)

如果您打算使用预处理器,根据其他答案,那么您可以让编译器自动确定NUM_TYPES的值:

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

答案 2 :(得分:21)

#define NUM_TYPES 4

答案 3 :(得分:11)

也可以使用枚举。

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

答案 4 :(得分:3)

Imho这是许多c编译器的缺陷。我知道我使用的编译器不会在地址中存储"静态const变量,而是用非常常量替换代码中的用法。这可以通过验证,因为当您使用预处理器#define指令和使用静态const变量时,您将获得生成代码的相同校验和。

无论哪种方式,你应该尽可能使用静态const变量而不是#defines,因为静态const是类型安全的。

答案 5 :(得分:3)

正如在其他答案中已经解释的那样,C中的const仅仅意味着变量是只读的。它仍然是运行时值。但是,您可以在C:

中使用enum作为实常数
enum { NUM_TYPES = 4 };
static int types[NUM_TYPES] = { 
  1, 2, 3, 4
};