#if 和 #define MY_MACRO (0)
使用#if 意味着您创建了一个“define”宏,即,将在代码中搜索以替换为“(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++ 代码视为 lagitimate 代码语句。上面相同的代码,通过简单的定义,它:
#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(甚至是Jim Buck 建议的#if 定义),最重要的是,给它们起这么长的名字,那么陌生,没有人在他/她的头脑中会使用它是“偶然”的,并且绝不会影响合法的 C++ 代码。
后经
现在,当我重新阅读我的帖子时,我想知道我是否应该尝试找到一些永远不会是正确的 C++ 的值来添加到我的定义中。就像是
#define MY_MACRO @@@@@@@@@@@@@@@@@@
可以与#ifdef和#ifndef一起使用,但如果在函数内部使用,则不允许代码编译...我在g ++上成功尝试过,它给出了错误:
main.cpp|410|error: stray ‘@’ in program|
有趣的。:-)