没有参数的#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 指令有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

.align 指令有啥作用?

fiddler断点测试修改响应指令有啥作用

letrec有啥好处?

opengl中 先用glFlush();然后glutSwapBuffers();有啥作用啊

ping命令有啥作用

使用内联 PTX asm() 指令时,'volatile' 有啥作用?