“#define XXX”的价值是什么?
它没有任何价值,但似乎没有编译错误。通常定义是定义类型替换,但它是定义类型 wiouht 替换 str。
它将用任何内容替换替换文本:
#define FOO
int FOO main() FOO
{
}
而且,#ifdef FOO
会成功。
空定义可能非常有用,例如在这种(天真的)函数形式中:
#ifndef NDEBUG
# include <cstdlib>
# define MakeSureThat(X) if (!(X)) { std::abort(); }
#else
# define MakeSureThat(X)
#endif
用法:
void do_stuff(Foo * p)
{
MakeSureThat(p != nullptr); // won't generate any code if NDEBUG
}
它将像往常一样定义XXX
到该行的其余部分。
在这种情况下,它是空的并不重要。
这里没有任何例外。
正如其他人所说,它的定义是空的,也就是说,在大多数情况下,它的替换文本是空的。但是,在#if
语句的常量表达式中,其值为 0:
#define XXX
#if XXX == 0
// yes, we get here
#elif
// no, we don't get here
#endif
对于根本未定义的名称也是如此:
#if YYY == 0
// yes, we get here
#elif
// no, we don't get here
#endif
这两者的区别在于后者没有定义,而前者是:
#ifdef XXX
// yes, we get here
#endif
#if defined(XXX)
// yes, we get here
#endif
因为YYY
这些测试都没有成功。