什么是“#define XXX”的价值?
它没有值,但似乎没有编译错误。通常定义是 定义类型替换,但它是定义类型wiouht replace str。
答案 0 :(得分:11)
它将取代替换文本:
#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
}
答案 1 :(得分:4)
通常会将XXX
定义为行的其余部分。
在这种情况下它是空的并不重要。
这里没有任何例外。
答案 2 :(得分:3)
正如其他人所说,它的定义是空的,也就是说,在大多数情况下,它的替换文本是空的。但是,在#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
这些测试都没有成功。