错误、漏洞、问题 - 页 2865

 

不可能为市场创建一个新产品,它说错误500。

产品已经创建并检查过了,它说它已经发布了,但是当你点击链接时,你得到的答案是500。

 
fxsaber:

自上而下地工作,作为一种文本替换。即:"TMP "将被 "VALUE "所取代。

Vladimir Simakov:

这不是一个编译器 - 它是一个预处理器)

变成了

,并且没有定义VALUE。

undef应该如何工作?

 
Andrey Khatimlianskii:

undef应该如何工作?

到此为止,有 "文本替换 "在进行。

 
Vladimir Simakov:

它不是一个编译器 - 它是一个预处理器)

变成了

而VALUE是未定义的。

#define  VALUE (VALUE*2)

我的理解是正确的,VALUE*2的值类型是常数,并且与替换本身相联系,即VALUE也是一个常数。编译器创建了两个常量。

如果是这样,它一定是在创造一个新的替代物。

#define  VALUE1 (VALUE*2)
#define  VALUE VALUE1

而且,如果代码上面的VALUE被定义为常量,那就不对了。

 
fxsaber:

到此为止,有 "文本替换 "在进行。

不匹配,在 "#define VALUE (TMP*2) "一行中,将TMP改为VALUE,这在后面。

 
Andrey Khatimlianskii:

不合,在 "#define VALUE (TMP*2) "一行中,将TMP改为VALUE,这是后话。

#define  MACROS TEXT
 // В этом интервале везде идет замена в исходнике MACROS на TEXT, как делалось бы в текстовом редакторе.
#undef  MACROS
就这样不断地替换,直到所有的替换都完成。
 
fxsaber:
就这样,替换不断地进行,直到全部结束。

有代码。

#define  VALUE 10       // 
#define  TMP VALUE      // 
#undef  VALUE           // 
#define  VALUE (TMP*2)  // 

第一个替换将整个代码中的VALUE改为10,直到#undef VALUE,剩下的就是这个。

#define  TMP 10
#define  VALUE (TMP*2)

接下来的替换将TMP改为10。事实证明

#define  VALUE (10*2)

我哪里做错了?

 
Andrey Khatimlianskii:

有代码。

第一个替换将整个代码中的VALUE改为10,直到#undef VALUE,剩下的就是这个。

接下来的替换将TMP改为10。事实证明

我做错了什么?

代替TMP的不是10,而是VALUE,但如果定义了VALUE(这很麻烦),就是10。

请看这一步一步的步骤。

#define  VALUE 10        
#define  TMP VALUE       
#undef  VALUE            
#define  VALUE (TMP*2)

void OnStart(void)
{
   Print(VALUE)
}

预处理程序忠实地插入了Print

Print((TMP*2));

然后,同样没有任何花招,用什么来代替?对。

Print((VALUE*2));

然后它抹去了所有预处理器的指令,只有在这之后,编译器才会得到这个。

void OnStart(void)
{
   Print((VALUE*2));
}
 
Vladimir Simakov:

TMP不是10,但VALUE被替换成了TMP,然后如果定义了VALUE(这是个问题),就是10

请看这一步一步的步骤。

预处理程序忠实地插入了Print

然后,同样没有任何花招,用什么来代替?对。

然后它抹去了所有预处理器的指令,只有在这之后,编译器才会得到这个。

这不叫 "自上而下"。

 
Andrey Khatimlianskii:

这不叫自上而下。

对不起,我在试图解释自己的时候弄糊涂了))))。

再来一次。

#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;}

void OnStart(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;}

void OnStart(void)
{
   int a=500,
       b=20;
   Print(min(500,Foo(b)));
}

而这只是一个铭文,但如果存款取决于这个功能呢?

原因: