#define VALUE 10#define TMP VALUE
#undef VALUE
#define VALUE (TMP*2)
在第二次定义VALUE时,没有定义VALUE宏,因此VALUE被定义为
(VALUE*2)
,因为TMP过去和现在都是由VALUE定义的。
但TMP在第二个VALUE定义后,被扩展为
(TMP*2)
(类似这样))
预处理器只是填入它所拥有的东西,如何定义和在哪里定义并不重要。这就是为什么你必须小心对待它。例子。
#define min(A,B) ((A)<(B)?(A):(B))
long Foo(int x) {return x*x;}
voidOnStart(void)
{
int a=500,
b=20;
Print(min(500,Foo(b))); //400
}
,现在让我们给这个函数添加一个邪恶的东西,即一个副作用
#define min(A,B) ((A)<(B)?(A):(B))
long Foo(int x){
Print("Увидивший это второй раз - нубяра vulgaris");
return x*x;}
voidOnStart(void)
{
int a=500,
b=20;
Print(min(500,Foo(b)));
}
不可能为市场创建一个新产品,它说错误500。
产品已经创建并检查过了,它说它已经发布了,但是当你点击链接时,你得到的答案是500。
自上而下地工作,作为一种文本替换。即:"TMP "将被 "VALUE "所取代。
这不是一个编译器 - 它是一个预处理器)
变成了
,并且没有定义VALUE。
undef应该如何工作?
undef应该如何工作?
到此为止,有 "文本替换 "在进行。
它不是一个编译器 - 它是一个预处理器)
变成了
而VALUE是未定义的。
我的理解是正确的,VALUE*2的值类型是常数,并且与替换本身相联系,即VALUE也是一个常数。编译器创建了两个常量。
如果是这样,它一定是在创造一个新的替代物。
#define VALUE VALUE1
而且,如果代码上面的VALUE被定义为常量,那就不对了。
到此为止,有 "文本替换 "在进行。
不匹配,在 "#define VALUE (TMP*2) "一行中,将TMP改为VALUE,这在后面。
不合,在 "#define VALUE (TMP*2) "一行中,将TMP改为VALUE,这是后话。
就这样,替换不断地进行,直到全部结束。
有代码。
第一个替换将整个代码中的VALUE改为10,直到#undef VALUE,剩下的就是这个。
接下来的替换将TMP改为10。事实证明
我哪里做错了?
有代码。
第一个替换将整个代码中的VALUE改为10,直到#undef VALUE,剩下的就是这个。
接下来的替换将TMP改为10。事实证明
我做错了什么?
代替TMP的不是10,而是VALUE,但如果定义了VALUE(这很麻烦),就是10。
请看这一步一步的步骤。
预处理程序忠实地插入了Print
然后,同样没有任何花招,用什么来代替?对。
然后它抹去了所有预处理器的指令,只有在这之后,编译器才会得到这个。
TMP不是10,但VALUE被替换成了TMP,然后如果定义了VALUE(这是个问题),就是10
请看这一步一步的步骤。
预处理程序忠实地插入了Print
然后,同样没有任何花招,用什么来代替?对。
然后它抹去了所有预处理器的指令,只有在这之后,编译器才会得到这个。
这不叫 "自上而下"。
这不叫自上而下。
对不起,我在试图解释自己的时候弄糊涂了))))。
再来一次。
在第二次定义VALUE时,没有定义VALUE宏,因此VALUE被定义为
(VALUE*2)
,因为TMP过去和现在都是由VALUE定义的。
但TMP在第二个VALUE定义后,被扩展为
(TMP*2)
(类似这样))
预处理器只是填入它所拥有的东西,如何定义和在哪里定义并不重要。这就是为什么你必须小心对待它。例子。
,现在让我们给这个函数添加一个邪恶的东西,即一个副作用
而这只是一个铭文,但如果存款取决于这个功能呢?