![]() |
1
1
我想你有点误解了。 常量表达式的实际计算是由编译器完成的,而不是由预处理器完成的。预处理器只计算宏,这与文本替换有关。 如果你退房 Boost.Preprocessor 您将认识到,即使是简单的操作(如加法或soutranctions)也不能使用公共表达式来表示,如果您希望由预处理器对它们进行评估的话。
这是在幕后通过子条件实现的,例如,您可以这样定义它(尽管这会很麻烦):
所以这与编译器所做的不同;) 至于测试编译器是否能够计算表达式,只需使用模板。
如果它编译,那么编译器就能够正确地计算表达式…否则它将无法实例化模板!
注:
的实际定义
|
![]() |
2
7
对。这些叫做 "constant expressions" 。(参见C++标准中的5.19(Exp.const))。
我不明白这个问题。某些表达式在预处理时计算
|
![]() |
3
1
这是C++标准5.19:
|
![]() |
4
1
回答最后一点:有许多常量可以在模板中使用,但不能在宏中使用。
例如,
另外,预处理器根本无法处理浮点运算。 |
![]() |
5
0
对我来说,它看起来不太标准,我确信C++是用布尔类型工作的,所以必须返回布尔类型(因为代码是C++的,不是因为模板,所以是C++)。可能会发生一些自动转换。作为一般的经验法则,尽量避免C++中的宏。 |
![]() |
MaPo · Linux,设置锁定ICMP_过滤器选项 4 月前 |
![]() |
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 4 月前 |
![]() |
Bobby · 复合字面值总是左值吗? 5 月前 |
![]() |
9-Pin · C: 嵌套结构的堆栈内存分配 5 月前 |