28

以下语句是什么意思:

#define FAHAD

我熟悉这样的陈述:

#define FAHAD 1

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

4

4 回答 4

22

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

#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
于 2013-08-06T08:01:38.347 回答
8

这意味着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
于 2013-08-06T08:01:18.913 回答
7

任何#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)

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

于 2013-08-06T08:11:54.460 回答
1
#define FAHAD

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

#ifdef FAHAD
printf();
#else
/* NA */
#endif
于 2013-08-06T08:29:29.390 回答