【问题标题】:#define IDENTIFIER without a token#define IDENTIFIER 没有令牌
【发布时间】:2013-08-06 07:59:15
【问题描述】:

以下语句是什么意思:

#define FAHAD

我熟悉以下语句:

#define FAHAD 1

但是没有标记的#define 语句意味着什么? 是不是类似于常量定义?

【问题讨论】:

  • 另请参阅link 以获取答案。

标签: c


【解决方案1】:

定义一个没有值的常量作为预处理器的标志,可以这样使用:

#define MY_FLAG
#ifdef MY_FLAG
/* If we defined MY_FLAG, we want this to be compiled */
#else
/* We did not define MY_FLAG, we want this to be compiled instead */
#endif

【讨论】:

    【解决方案2】:

    表示FAHAD已定义,您可以稍后检查它是否已定义:

    #ifdef FAHAD
      //do something
    #else
      //something else
    #endif
    

    或者:

    #ifndef FAHAD //if not defined
    //do something
    #endif
    

    现实生活中的一个例子是检查一个函数或头文件是否可用于您的平台,通常构建系统会定义宏以指示在实际编译之前存在某些函数或头文件,例如检查signal.h可用:

    #ifdef HAVE_SIGNAL_H
    #   include <signal.h>
    #endif/*HAVE_SIGNAL_H*/
    

    这会检查某些功能是否可用

    #ifdef HAVE_SOME_FUNCTION
    //use this function
    #else
    //else use another one
    #endif
    

    【讨论】:

      【解决方案3】:

      任何#define 都会导致将原始标识符替换为替换标记。如果没有替换令牌,则替换为空:

      #define DEF_A "some stuff"
      #define DEF_B 42
      #define DEF_C
      printf("%s is %d\n", DEF_A, DEF_B DEF_C);
      

      扩展为:

      printf("%s is %d\n", "some stuff", 42 );
      

      我在42) 之间放了一个空格来表示DEF_C 扩展为的“无”,但至少就语言而言,预处理器的输出只是一个标记流。 (实际的编译器通常会让你看到预处理器的输出。这里是否会有任何空白取决于实际的预处理器。对于 GNU cpp,有一个。)

      与到目前为止的其他答案一样,您可以使用#ifdef 来测试标识符是否为#defined。你也可以写:

      #if defined(DEF_C)
      

      例如。即使扩展为空,这些测试也是肯定的(即,标识符定义)。

      【讨论】:

        【解决方案4】:
        #define FAHAD
        

        这就像一个编译器标志,在它下面可以完成一些代码。 这将指示编译器编译此编译器选项下存在的代码

        #ifdef FAHAD
        printf();
        #else
        /* NA */
        #endif
        

        【讨论】:

          猜你喜欢
          • 2014-12-08
          • 2011-11-27
          • 1970-01-01
          • 1970-01-01
          • 2017-12-16
          • 1970-01-01
          • 1970-01-01
          • 2022-07-15
          • 2012-11-17
          相关资源
          最近更新 更多