Liv*_*viu 0 c++ preprocessor-directive
我知道它#define具有以下语法:#define SYMBOL string
例如,如果我写
#define ALPHA 2-1
#define BETA ALPHA*2
Run Code Online (Sandbox Code Playgroud)
然后ALPHA = 1但BETA = 0.(为什么?)
但如果我写这样的东西
#define ALPHA (2-1)
#define BETA ALPHA*2
Run Code Online (Sandbox Code Playgroud)
然后ALPHA = 1和BETA = 2.
有人可以解释一下这两者之间有什么区别吗?
使用的预处理器宏#define是文本替换.
这两个例子并不相同.第一集BETA是2-1*2.第二集BETA到了(2-1)*2.声称ALPHA == 1与你一样,这是不正确的,因为ALPHA它不是一个数字 - 它是一个自由的人!它只是一系列人物.
当解析为C或C++时,这两个表达式是不同的(第一个是相同的2 - (1*2)).
我们可以通过打印字符串扩展BETA以及将其作为表达式进行评估来显示差异:
#ifdef PARENS
#define ALPHA (2-1)
#else
#define ALPHA 2-1
#endif
#define BETA ALPHA*2
#define str(x) str2(x)
#define str2(x) #x
#include <stdio.h>
int main()
{
printf("%s = %d\n", str(BETA), BETA);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译上面有和没有PARENS定义,看看差异:
(2-1)*2 = 2
2-1*2 = 0
Run Code Online (Sandbox Code Playgroud)
这样做的结果是,当使用#define创建扩展为表达式的宏时,通常使用比通常需要的更多括号通常是个好主意,因为您不知道将扩展值的上下文.例如:
#define ALPHA (2-1)
#define BETA ((ALPHA)*2)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
78 次 |
| 最近记录: |