#define与运营商一起使用

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 = 1BETA = 0.(为什么?)

但如果我写这样的东西

#define ALPHA (2-1)
#define BETA ALPHA*2
Run Code Online (Sandbox Code Playgroud)

然后ALPHA = 1BETA = 2.

有人可以解释一下这两者之间有什么区别吗?

Tob*_*ght 5

使用的预处理器宏#define文本替换.

这两个例子并不相同.第一集BETA2-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)