#if和#define MY_MACRO(0)
使用#if意味着您创建了一个“定义”宏,即将在代码中搜索的东西替换为“(0)”。这是我讨厌在C ++中看到的“宏观地狱”,因为它会污染代码并可能修改代码。
例如:
#define MY_MACRO (0)
int doSomething(int p_iValue)
{
return p_iValue + 1 ;
}
int main(int argc, char **argv)
{
int MY_MACRO = 25 ;
doSomething(MY_MACRO) ;
return 0;
}
在g ++上给出以下错误:
main.cpp|408|error: lvalue required as left operand of assignment|
||=== Build finished: 1 errors, 0 warnings ===|
只有一个错误。
这意味着您的宏已成功与C ++代码进行了交互:对该函数的调用成功。在这种简单的情况下,这很有趣。但是我自己对宏无声播放代码的经验并不充满喜悦和充实,所以...
#ifdef和#define MY_MACRO
使用#ifdef意味着您“定义”某些内容。不是说您给它一个价值。它仍然在污染,但是至少,它将被“什么也没有取代”,并且C ++代码不会将其视为滞后的代码语句。上面的相同代码,带有一个简单的定义:
#define MY_MACRO
int doSomething(int p_iValue)
{
return p_iValue + 1 ;
}
int main(int argc, char **argv)
{
int MY_MACRO = 25 ;
doSomething(MY_MACRO) ;
return 0;
}
给出以下警告:
main.cpp||In function ‘int main(int, char**)’:|
main.cpp|406|error: expected unqualified-id before ‘=’ token|
main.cpp|399|error: too few arguments to function ‘int doSomething(int)’|
main.cpp|407|error: at this point in file|
||=== Build finished: 3 errors, 0 warnings ===|
所以...
结论
我宁愿在代码中不使用宏,但是由于多种原因(定义标头保护或调试宏),我不能这样做。
但至少,我希望使用合法的C ++代码使它们之间的交互最少。这意味着使用没有价值的#define,使用#ifdef和#ifndef(甚至是Jimif建议的#if定义),最重要的是,给它们起如此长的名字,以至于任何人都不会在他/她的右脑中使用它是“偶然”的,绝不会影响合法的C ++代码。
圣经后
现在,当我重新阅读我的文章时,我想知道是否不应该尝试找到一些永远无法将正确的C ++添加到我的定义中的值。就像是
#define MY_MACRO @@@@@@@@@@@@@@@@@@
可以与#ifdef和#ifndef一起使用,但是如果在函数内部使用,则不让代码进行编译...我在g ++上成功尝试了此操作,并给出了错误:
main.cpp|410|error: stray ‘@’ in program|
有趣。:-)
#if
,您还可以#elif
以一致的方式使用,而不是使用#ifdef
。因此,而不是仅使用#define BLAH
,#define BLAH 1
和#if BLAH
...等等一起使用