4

“#define XXX”的价值是什么?

它没有任何价值,但似乎没有编译错误。通常定义是定义类型替换,但它是定义类型 wiouht 替换 str。

4

3 回答 3

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
}
于 2013-04-27T23:23:04.173 回答
4

它将像往常一样定义XXX到该行的其余部分。

在这种情况下,它是空的并不重要。

这里没有任何例外。

于 2013-04-27T23:27:42.343 回答
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这些测试都没有成功。

于 2013-04-28T15:56:49.610 回答