没有参数的#define指令有什么作用?

时间:2014-03-16 06:50:10

标签: c c-preprocessor header-files preprocessor-directive

在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语句会做什么?

3 个答案:

答案 0 :(得分:5)

有三种可能的"值"对于预处理器中的标识符:

  1. 未定义:我们不知道这个名字。
  2. 已定义,但为空:我们知道此名称,但它没有任何价值。
  3. 定义,有价值:我们知道这个名字,它有一个值。
  4. 第二个,已定义但为空,通常用于条件编译,其中测试仅用于标识符的定义,而不是值:

    #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)。

答案 1 :(得分:1)

他们定义了一个扩展为空的宏。如果你打算将它用作宏,它就没有用,但是当它与#ifdef和朋友结合使用时非常有用 - 例如,你可以用它来创建一个包含守卫,所以当你{{1一个文件多次,受保护的内容只包含一次。

答案 2 :(得分:1)

您定义的内容如下:

#define _ANSI_STDARG_H_

以便稍后您可以查看:

#ifdef _ANSI_STDARG_H_