错误、漏洞、问题 - 页 2864

 
Andrey Khatimlianskii:

那么,为什么它不工作呢?

最有可能的是,这种方法在任何地方都不起作用。因为有一个替换正在进行,右边的VALUE是未定义的。

#define  VALUE (VALUE*2)
 
fxsaber:

这种方法可能在任何地方都不起作用。因为有一个替换正在进行,右边的VALUE是未定义的。

而且,改变别人的宏观替代物是邪恶的。如果这些是预定义的环境宏,那就更是如此。在项目的 所有文件都组装完毕后,覆盖的宏最终会在哪里并不重要。最好是定义你自己的_VALUE宏。
 
Vladimir Simakov:
是的,而且改变别人的宏观替代物是邪恶的。

如果没有这种邪恶,就不会发生这种 情况。

 
Vladimir Simakov:
而且,改变别人的宏观替代物是邪恶的。特别是如果它们是预定义的环境宏。在项目的所有文件集合起来后,宏的覆盖最终会在哪里,这并不重要。你最好定义你自己的_VALUE宏。
请问,为什么不能使用将VALUE值赋值给全局变量,然后将其相乘并替换到最终定义中?
 
Valeriy Yastremskiy:
请问,为什么不能用VALUE赋值给全局变量,并将其相乘后代入最后的定义中?

你可以,但这样就失去了宏替换的意义(替换代码中的值)。所有的希望都寄托在编译器上,它将const类型(顺便说一下,你已经定义了变量类型?

但除此之外,是的,你可以。

#ifdef  MACROS
   const int gValue=2*VALUE;
   #undef  VALUE
   #define  VALUE gValue
#endif
 
Vladimir Simakov:

但后来,是的,你可以。

用这个就不行了。

void Func( int = VALUE ) {}
 
fxsaber:

它不会对这个人起作用。

对了,我们再一次要求constexpr把它变成这样
constexpr auto x = 100;

void Foo(int _x = x) {
    std::cout << _x<<std::endl;
}

int main() {
    Foo();
    return 0;
}
 
fxsaber:

这种方法可能在任何地方都不起作用。因为有这样的替换在进行,其中右边的VALUE没有被定义。

显然,我根本不了解编译器的工作原理。我想象的是,字符串是按顺序解析的。所以右边没有未定义的值。

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

显然,我根本不了解编译器的工作原理。我想象的是,字符串是按顺序分析的。所以右边没有未定义的值。

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

 
Andrey Khatimlianskii:

显然,我根本不了解编译器的工作原理。我想象的是,字符串是按顺序分析的。所以右边没有未定义的值。

这不是编译器--是预处理程序)

#define  VALUE (TMP*2)

变成了

#define  VALUE (VALUE*2)

,而你的VALUE是未定义的。