与“static”相比,“static const”从正确性/UB的角度来看是否更好/需要?

问题描述 投票:0回答:1

例如,我正在编写一个枚举→字符串函数。

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)。

c static
1个回答
1
投票

在这个具体案例中:

    static const char *names[] = {
            [FOO1]="a foo", [FOO2]="another foo", [FOO3]="foo the third",
    };

names
定义为
const char *
数组是有意义的,因为您将字符串文字的起始地址分配给每个元素,并且字符串文字是只读的(尽管由于历史原因而不是
const
)。

但是,一般来说,没有特定原因

static
变量需要声明为
const
。 特别是,考虑到您的第二个示例,将
map
声明为
const
没有任何好处。

© www.soinside.com 2019 - 2024. All rights reserved.