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

Sam*_*Sam 81 c arrays static const objective-c

我想创建一个在我的Objective-C实现文件中使用的常量静态数组,类似于我的".m"文件的顶层.

static const int NUM_TYPES = 4;
static int types[NUM_TYPES] = { 
  1,
  2, 
  3, 
  4 };
Run Code Online (Sandbox Code Playgroud)

我打算NUM_TYPES稍后在文件中使用,所以我想把它放在一个变量中.

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

"在文件范围内修改了'类型'"

我认为这可能与数组大小是变量有关(当我在那里放一个整数文字时,我不会收到此消息static int types[4]).

我想解决这个问题,但也许我说这一切都错了......我在这里有两个目标:

  1. 拥有一个可在整个文件中访问的数组
  2. 要封装NUM_TYPES到变量中,所以我的文件中的不同位置没有相同的文字

有什么建议?

[编辑]在C Faq中找到了这个:http://c-faq.com/ansi/constasconst.html

lar*_*rsr 60

这种警告的原因是c中的const并不意味着常数.这意味着"只读". 因此,该值存储在内存地址中,可能会被机器代码更改.

  • 改进此答案的一种方法是展示如何解决此问题. (10认同)
  • 修改一个定义为`const`的对象(例如通过从指针中删除`const`并存储一个值)是未定义的行为; 因此,这样的对象的值是编译时或运行时常量(取决于存储持续时间).该值不能仅用于常量表达式,因为C标准没有说它可以.(如果没有`const`定义目标对象或动态分配目标对象,则允许转换`const`并存储值;字符串文字不是`const`但可能不会被写入.) (3认同)
  • @jilles"可能被机器代码更改"并不意味着这个答案的作者意味着"可能会被C代码改变".此外,这确实有另一个很好的理由:在编译当前TU时,在不同的TU中可能存在`extern`常量,其中的值是未知的. (3认同)

caf*_*caf 32

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

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

  • 是的,像这样的对象的`sizeof`的结果是编译时常量. (2认同)

小智 11

也可以使用枚举.

typedef enum {
    typeNo1 = 1,
    typeNo2,
    typeNo3,
    typeNo4,
    NumOfTypes = typeNo4
}  TypeOfSomething;
Run Code Online (Sandbox Code Playgroud)


Cyg*_*sX1 5

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

enum { NUM_TYPES = 4 };
static int types[NUM_TYPES] = { 
  1, 2, 3, 4
};
Run Code Online (Sandbox Code Playgroud)