没有令牌的#define IDENTIFIER

Fah*_*war 12 c

以下陈述的含义是什么:

#define FAHAD
Run Code Online (Sandbox Code Playgroud)

我熟悉这样的陈述:

#define FAHAD 1
Run Code Online (Sandbox Code Playgroud)

但是没有令牌的#define语句是什么意思呢?它是否类似于常量定义?

Ner*_*ius 9

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

#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
Run Code Online (Sandbox Code Playgroud)


iab*_*der 6

它意味着FAHAD已定义,您可以稍后检查它是否已定义:

#ifdef FAHAD
  //do something
#else
  //something else
#endif
Run Code Online (Sandbox Code Playgroud)

要么:

#ifndef FAHAD //if not defined
//do something
#endif
Run Code Online (Sandbox Code Playgroud)

实际的示例用法是检查您的平台是否可以使用函数或标题,通常构建系统将定义宏以指示在实际编译之前存在某些函数或标题,例如,此检查是否signal.h可用:

#ifdef HAVE_SIGNAL_H
#   include <signal.h>
#endif/*HAVE_SIGNAL_H*/
Run Code Online (Sandbox Code Playgroud)

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

#ifdef HAVE_SOME_FUNCTION
//use this function
#else
//else use another one
#endif
Run Code Online (Sandbox Code Playgroud)


tor*_*rek 6

#define使用替换标记替换原始标识符的任何结果.如果没有替换令牌,则替换为空:

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

扩展为:

printf("%s is %d\n", "some stuff", 42 );
Run Code Online (Sandbox Code Playgroud)

我在42和之间放了一个空格)来表示DEF_C扩展到的"无" ,但至少在语言方面,预处理器的输出只是一个令牌流.(实际的编译器通常会让你看到预处理器输出.这里是否会有任何空格取决于实际的预处理器.对于GNU cpp,有一个.)

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

#if defined(DEF_C)
Run Code Online (Sandbox Code Playgroud)

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