|
|
1
34
|
|
2
27
这里的大多数答案都集中在宏观替代的效果上。但我想他想知道
在编译时计算。首先,这是一个算术常量表达式,另外还有一个整型常量表达式(因为它只有整数类型的文本)。实现可以在运行时自由地计算它,但它还必须能够在编译时计算它,因为
如果编译器基本上可以在编译时计算结果,那么它应该使用该值,而不是在运行时重新计算。但也许还有一些理由这么做。我不知道。 对不起,我回答的问题好像是关于C++的。注意,今天您询问了C。表达式中的溢出在C中被视为未定义的行为,不管它是否发生在常量表达式中。当然,第二点在C中也是如此。
编辑
:作为注释,如果宏被替换为表达式,如
|
|
|
3
13
我不知道有什么标准可以保证它会被优化。预处理器将用32768/10代替计时器100μMS,您可以通过运行gcc-c看到。要查看编译器是否在进一步优化,请运行gcc-S并检查汇编程序。在gcc 4.1中,即使没有任何优化标志,在编译过程中也会减少到常量:
|
|
|
4
11
考虑:
|
|
|
5
10
从 WG14/N1124 Committee Draft â May 6, 2005 ISO/IEC 9899:TC2 :
|
|
|
6
9
代码中使用的每个地方
|
|
|
7
8
伙计们,这种转换被称为“常数折叠”,甚至大多数学生编译器都会这样做。只要你有一个不是你或你大学室友的编译器,并且你正在编译一种静态类型的语言,即使没有打开优化,你也可以依赖它。如果你在处理一种可以改变语言含义的古怪的动态语言,那就不同了
|
|
|
8
0
|
|
|
9
-4
编辑 一位评论员要求提供参考-
编辑结束 |
|
|
Timo · 如果宏变量后跟构成有效标识符的字符,则不会展开宏变量 7 年前 |
|
|
user3623498 · 在#if中更改变量时出现问题 7 年前 |
|
|
einpoklum · 来自#cmakedefine替换的意外结果 7 年前 |
|
|
Joseph Franciscus · C中预处理器方法的别名++ 8 年前 |
|
|
stoper · 防止同一宏在多个转换单元中具有不同的定义 8 年前 |
|
|
СеÑгей · MinGW中预处理器g++的奇怪行为 8 年前 |