繁体   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