在C语言中,你能够基于另一个常量来定义一个常量吗?

9
今天我在开发一个C程序时,我的一位同学指出我在做错了什么。
他说我正在做的代码(类似于下面的代码)是错误的,你不能基于另一个常量来定义一个常量。 最终程序还是运行了,但我不确定他是否正确。 下面的代码是错误的/违反最佳实践吗?
const int num=5;
const int num2=num*2;

1
在文件作用域中是非法的。 - BLUEPIXY
@KerrekSB:它可以使用Clang编译(在ideone上选择“C”选项),因此我认为需要从规范中得出明确的答案。 https://ideone.com/YEjKil - indiv
1
@indiv:嗯,也许相关:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53091 - Kerrek SB
1
“[...] 说代码 [...] 类似于下面的代码是错误的。”编译器到底说了什么?请复制并粘贴输出内容。此外,这两个代码有多不相似(实际编译的代码和提供的代码)? - rslemos
1
适用于C ++,不适用于C。 https://dev59.com/Pm855IYBdhLWcg3wMBPV - B. Wolf
显示剩余11条评论
2个回答

10
这些不是常量;它们是带有“const”限定符的“int”变量。 “const”限定符意味着程序无法将变量写入。实际整数常量表达式的示例包括“5”,“2 + 3”和“sizeof(int)”。这里是完整列表
在文件作用域中,第二行是违反约束条件的,因为变量的名称不是常量表达式。 约束是C11 6.7.9 / 4:
所有具有静态或线程存储期的对象的初始化器中的所有表达式都必须是常量表达式或字符串字面值。
(在文件作用域声明的变量具有静态或线程存储期)。
在块作用域中,代码没问题,因为那里的初始化器不需要是常量表达式。

5

在 C 语言中,实现这个功能的经典方式(你可能已经知道)是编写以下代码:

#define NUM  5
#define NUM2 (NUM*2)

表达式周围有括号,但是行末没有分号,因为预处理器将宏扩展为简单的词法替换。因此,表达式20/NUM2将扩展为20/(5*2)。如果没有括号,则会变成20/5*2,这是错误的。
顺带一提,在C++中,您可以使用constexpr来获得所需的行为;constexpr变量可用于静态初始化程序或模板参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接