没有参数的#define 指令有啥作用?
Posted
技术标签:
【中文标题】没有参数的#define 指令有啥作用?【英文标题】:What does a #define directive without an argument do?没有参数的#define 指令有什么作用? 【发布时间】:2014-03-16 06:50:09 【问题描述】:在 Apple 的开源网站上,entry for stdarg.h 包含以下内容:
#ifndef _STDARG_H
#ifndef _ANSI_STDARG_H_
#ifndef __need___va_list
#define _STDARG_H
#define _ANSI_STDARG_H_
#endif /* not __need___va_list */
#undef __need___va_list
如果#define 语句的第一个参数后面没有任何内容,它们会做什么?
【问题讨论】:
它们只是定义宏以扩展为空,但对#ifdef
很有用
【参考方案1】:
预处理器中的标识符有三种可能的“值”:
-
未定义:我们不知道这个名称。
已定义,但为空:我们知道此名称,但没有任何价值。
已定义,有值:我们知道这个名称,它有一个值。
第二个,已定义但为空,通常用于条件编译,其中测试只是针对标识符的定义而不是值:
#ifdef __cplusplus
// here we know we are C++, and we do not care about which version
#endif
#if __cplusplus >= 199711L
// here we know we have a specific version or later
#endif
#ifndef __cplusplus // or #if !defined(__cplusplus)
// here we know we are not C++
#endif
这是一个带有名称的示例,如果它被定义,它将有一个值。但是还有其他的,例如 NDEBUG,通常定义为没有任何值(通常在编译器命令行上使用-DNDEBUG
)。
【讨论】:
感谢您的解释。我想我现在明白了目的。在您的最后一个示例中,defined()
只是 C 中内置的宏运算符?
它是 C 预处理器的一部分。你可以在这里阅读defined()
:gcc.gnu.org/onlinedocs/cpp/Defined.html【参考方案2】:
他们定义了一个扩展为空的宏。如果您打算将其用作宏,则它不是很有用,但是当与 #ifdef
和朋友结合使用时,它非常有用 - 例如,您可以使用它来创建包含保护,所以当您 #include
一个文件时多次,受保护的内容只包含一次。
【讨论】:
【参考方案3】:你定义如下:
#define _ANSI_STDARG_H_
这样,稍后您可以检查:
#ifdef _ANSI_STDARG_H_
【讨论】:
所以它有时被用作不同操作系统的一种标志吗?就像#define INT_IS_32
一样,然后其他一些头文件会检查 int 是否为 32 位?
是的。另一个例子:#define TEST_MODE
和 #ifdef TEST_MODE
。以上是关于没有参数的#define 指令有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章