我想创建一个在我的Objective-C实现文件中使用的常量静态数组,类似于我在“.m”文件顶层的类似内容:
static const int NUM_TYPES = 4;
static int types[NUM_TYPES] = {
1,
2,
3,
4 };
我打算稍后在文件中使用NUM_TYPES
,所以我想把它放在一个变量中。
然而,当我这样做时,我收到错误
“在文件范围内修改''类型'”
我认为这可能与数组大小是变量有关(当我在那里放一个整数文字时,我不会收到此消息,例如static int types[4]
)。
我想解决这个问题,但也许我说错了...我在这里有两个目标:
NUM_TYPES
封装到变量中,因此我的文件中的不同位置没有相同的字面值有什么建议吗?
[编辑] 在C Faq:http://c-faq.com/ansi/constasconst.html
中找到了这个答案 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
};