什么'#define xxx'(没有价值!)做,与'#define xxx yyy'(有价值)形成鲜明对比?

时间:2014-10-03 15:01:00

标签: c++ macros c-preprocessor

#define <text> <substitute>定义了一个宏。但是#define <text>呢,就是这样呢?那是做什么的?例如,在标题保护的上下文中。

4 个答案:

答案 0 :(得分:5)

它还定义了一个宏,无需替换。

  

例如在标题保护的上下文中。

在这种情况下,我们只需要知道是否已经定义了保护宏 - 我们可以使用#ifdef#ifndef来检查。它不需要被定义为任何东西,因此我们通常不会为任何事情烦恼。这给出了通常的守卫形式

#ifndef HEADER_H    // check whether it's defined, skip to "endif" if so
#define HEADER_H    // define it; doesn't need to contain anything

// header contents

#endif              // skip to here (end of header) if already defined

以便包含一次将包含内容并定义宏;包括它第二次将无害地跳过内容,而不是重复它们(可能)导致错误。

答案 1 :(得分:3)

这种类型的宏没有替代品。

#define FOO

当宏仅用于测试它是否存在时,它非常有用:

#ifdef FOO

#if defined(FOO)

答案 2 :(得分:2)

它将指定的标识符定义为 nothing 。就这么简单。

答案 3 :(得分:1)

它定义了一个宏。当在代码中遇到该宏字时,它将被替换为任何内容。

这并非完全没用,因为仍然可以使用#ifdef检测宏。它经常用于提供不同代码段的可选编译。

当用作包含保护(使用#ifndef)时,它可以防止在单个源文件中多次处理标题。