例如,我正在编写一个枚举→字符串函数。
static const char *fooname(enum Foo f) {
/* assumes f is a valid Foo enum */
static const char *names[] = {
[FOO1]="a foo", [FOO2]="another foo", [FOO3]="foo the third",
};
return names[f];
}
我对静态的理解:a)它限制范围与声明全局
names[]
b)它是必需的,否则返回的指针将指向堆栈变量。但是,虽然我已经放置了 const
,但我不确定是否有必要将名称声明为 static const
,以防止此处出现任何 UB/ 的正确性。
举另一种情况,其中涉及简单整数:
int myfn(int i) {
/* assumes i is a valid index*/
static const int map[] = {24, 45, 56};
return map[i];
}
这里,我使用了静态,因为我们不需要每次都重新创建
map
。
我想我的主要问题是:根据我的理解,将变量写为 const 更多的是一种风格问题,但如果一个人不想使用 const,那么在这些特殊情况下是否需要使用 static 或像大多数其他情况一样可选案例? (我知道对于指针的参数,我们绝对应该声明 const)。
在这个具体案例中:
static const char *names[] = {
[FOO1]="a foo", [FOO2]="another foo", [FOO3]="foo the third",
};
将
names
定义为 const char *
数组是有意义的,因为您将字符串文字的起始地址分配给每个元素,并且字符串文字是只读的(尽管由于历史原因而不是 const
)。
但是,一般来说,没有特定原因
static
变量需要声明为 const
。 特别是,考虑到您的第二个示例,将 map
声明为 const
没有任何好处。