错误、漏洞、问题 - 页 2866

 

一切都是可能的,只需要添加一个宏就可以了

#define  VALUE 10

MACRO( VALUE, VALUE2 )

#define  VALUE   VALUE2*2

void f( int i = VALUE ) { Print( i ); }
void OnStart()
{
        f();
}

结果:20

 
A100:

一切都是可能的,只需要添加一个宏就可以了

结果:20。

这是非常好的。我不善于猜谜。

 
Vladimir Simakov:

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

再来一次。

在第二次定义VALUE时,没有定义VALUE宏,因此VALUE被定义为

,因为TMP过去和现在都是由VALUE定义的。

但TMP在第二个VALUE定义后,被扩展为

(类似这样))

预处理器只是填入它所拥有的东西,如何定义和在哪里定义并不重要。这就是为什么你必须小心对待它。例子。

,现在让我们给这个函数添加一个邪恶的东西,即一个副作用

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

有趣的)当你得到它时)。

#define  VALUE 10        
#define  TMP VALUE       
#undef  VALUE     

答对了,撤销替换后,第一行不再是10,第二行TMP是VALUE,但不是10。也就是说,替代远远不是分配。

 
Valeriy Yastremskiy:

有趣的)当你得到它时)。

答对了,撤销替换后,第一行不再是10,第二行TMP是VALUE,但不是10。也就是说,替代远远不是一种分配。

是的,替代正是替代,一对一的替代。但当您的代码中定义了VALUE宏(不要与预处理器指令 混淆)时,预处理器会进一步展开TMP->VALUE->10,如果没有,则展开TMP->VALUE。在这种情况下,预处理器指令不参与代码本身,它们在编译时不再存在。例子。

#define  VALUE 10
#define  TMP VALUE

void OnStart()
{
   Print(TMP); //10
if (false){
   #undef  VALUE
   #define  VALUE 20
   Print(TMP);}
else Print(TMP); //20
}
 
Vladimir Simakov:

是的,替代正是替代,是一对一的替代。简单地说,当在你的代码中进行替换时,定义了VALUE宏(不要与预处理器指令 混淆),预处理器将展开TMP->VALUE->10,如果没有,则展开TMP->VALUE。在这种情况下,预处理器指令不参与代码本身,它们在编译时不再存在。例子。

是的,如果你注释掉第二个VALUE替换20,VALUE变量声明就会消失,编译器就不会看到它,就会责骂)

 
A100:

一切都是可能的,只需要添加一个宏就可以了

结果:20

我放弃了)))。

它是如何定义的?

MACRO

?

 
Vladimir Simakov:

我放弃了)))。

如何确定

?

这么快?并非所有的专家都已加入进来......我们将等待一个星期。

提示:这个方法也适用(但解决方案略有不同)。

#define  VALUE1 10
#define  VALUE2 5

MACRO2( VALUE1, VALUE12 )
MACRO2( VALUE2, VALUE22 )

#define  VALUE1  VALUE12*2
#define  VALUE2  VALUE22*3

int f1( int i = VALUE1 ) { return i; }
int f2( int i = VALUE2 ) { return i; }
void OnStart()
{
        Print(f1(),":",f2());
}

结果:20:15

 
Vladimir Simakov:

因为TMP过去是,现在也是,由VALUE定义。

这就是 "自上而下 "反驳的地方。

否则,TMP就不是 "按照定义,所以它仍然是定义的",而是之前被10所取代(VALUE被取代)。

因此,预处理器并不是在逐行处理代码。尚待解决的是如何解决。


@A100,如果你不介意的话,简而言之。
没有足够的兴趣去谷歌和阅读,但足够的兴趣去问。

我的逻辑有什么问题?

我想象的是,这些弦是按顺序分析的。所以右边没有未定义的值。

#define  VALUE 10       // VALUE = 10
#define  TMP VALUE      // TMP = 10
#undef  VALUE           // VALUE = EMPTY
#define  VALUE (TMP*2)  // TMP = 10, следовательно VALUE = 20
 
A100:

提示:这也是可行的(但解决方案略有不同)。

所以在行动上与MACRO和MACRO2相同。

 
Andrey Khatimlianskii:

我的逻辑有什么问题?

#define  VALUE 10       // VALUE = 10
#define  TMP VALUE      // TMP = 10 VALUE
#undef  VALUE           // VALUE = EMPTY
#define  VALUE (TMP*2)  // TMP = 10 EMPTY, следовательно VALUE = 20 EMPTY