C++ 重新定义符号的算法是如何工作的?

C++ 重新定义符号的算法是如何工作的?,c++,c-preprocessor,C++,C Preprocessor,C++允许程序员以编程的方式重新定义符号 #define A 0 但是,这些重新定义的符号在彼此上下文中以及在算术中使用时的行为方式是不寻常的,因为这些值被视为字符串,而不是文字 我对这个算法使用的逻辑感到困惑,希望能得到一个关于它是如何工作的解释。我已经做了多次测试,试图通过使用不同的值来理解它是如何工作的,但这仍然让我感到困惑 例1: #define A 0 #define B A+1 #define C 1-B cout << C; #定义一个0 #定义B+A+1 #定义

C++允许程序员以编程的方式重新定义符号

#define A 0
但是,这些重新定义的符号在彼此上下文中以及在算术中使用时的行为方式是不寻常的,因为这些值被视为字符串,而不是文字

我对这个算法使用的逻辑感到困惑,希望能得到一个关于它是如何工作的解释。我已经做了多次测试,试图通过使用不同的值来理解它是如何工作的,但这仍然让我感到困惑

例1:

#define A 0
#define B A+1
#define C 1-B

cout << C;
#定义一个0
#定义B+A+1
#定义C 1-B
cout预处理器宏支持文本替换。你的两个例子被简化成一行C++代码:
cout << 1-0-1;

cout这些宏只需内联替换为您定义的宏即可。因此:

#define A 0
#define B A+1
#define C 1-B

cout << C;
#定义一个0
#定义B+A+1
#定义C 1-B

cout宏是文本替换。以下几行显示了如何逐步用预处理器替换文本:

cout << C;
cout << 1-B;
cout << 1-A+1;
cout << 1-0+1;

cout << BETA;
cout << ALPHA * 2;
cout << 2-1 * 2;

这些是“c预处理器”宏的示例,而不是枚举类型(这将涉及关键字
enum
)。请注意,使用
#define
会有危险<代码>#定义一个0
表示程序中的所有
A
都将替换为0。这个过程完全是无意识的,因此无论替换是否合理,都将替换
A
。这意味着
class A
将变成
class 0
,因为在代码中看到的都是
class A
,编译器生成的错误消息可能看起来完全疯狂,就像数值常量前面的预期标识符一样,箭头指向
class A
中的
A
,表示,编译器在解释所发生的事情方面已经做得更好了,今天你可能会得到一些只是部分疯狂的东西:也许值得一提的是,预处理器是一种黑客,它支持在过去的迷雾中很难做到的事情。从那时起C就已经移动了不少,C++提供了很多(可以用来替换)我们以前用来处理预处理器的东西的特性。我喜欢逐步解释+ 1。
#define A 0
#define B A+1
#define C 1-B

cout << C;
cout << 1-0+1;
#define ALPHA 2-1
#define BETA ALPHA * 2

cout << BETA;
cout << 2-1 * 2;
cout << C;
cout << 1-B;
cout << 1-A+1;
cout << 1-0+1;

cout << BETA;
cout << ALPHA * 2;
cout << 2-1 * 2;