1

如果我定义

#if SOMETHING

#endif

而且我还没有在任何地方定义一些东西。#if 中的代码会编译吗?

4

4 回答 4

2

当参数表达式中使用的名称#if未定义为宏时(在所有其他宏替换完成后),将其替换为0。这意味着您#if SOMETHING将被解释为#if 0. 下面的代码#if将被预处理器删除。

该规则也适用于更复杂的表达式。你可以做

#define A 42
#if A + B

这将评估为#if 42,因为未知名称B被解释为0

于 2012-08-02T01:48:01.353 回答
1

不,只要 SOMETHING 也不是预定义的宏之一或在命令行上传递给编译器的宏。

于 2012-08-02T01:35:01.503 回答
0

我认为在 C99 中它默认为 0 而在 C89 中它不像这里它给我一个错误

Source code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define A 42
#define B 

int main(int argc, char *argv[]){

int c;

#if A
c = A + B;
#endif

printf("%d\n",c);

return 0;
}

Error : 

error: expected expression before ‘;’ token
于 2012-08-02T04:36:00.293 回答
-1

不,因为作为一个未定义的宏,它不一定会被任何东西替换......但这可能是编译器特定的,并且不被信任。

您可能想使用:

 #ifdef DEFINED_WORD
 #ifndef DEFINED_WORD

其中 DEFINED_WORD 由#define 声明,例如: #define DEFINED_WORD。该ifdef构造仅编译该代码和#endif如果定义了 DEFINED_WORD 之间的代码。反之亦然#ifndef。你可以像这样嵌套它们:

 #ifdef DEFINED_WORD
 printf ( "DEFINED_WORD is defined\n" );
 #ifndef DEFINED_WORD
 printf ( "This line will NEVER print\n" );
 #endif
 printf ( "This line will print if DEFINED_WORD is defined\n" );
 #endif
 printf ( "This line will ALWAYS print.\n" );

在我的代码中,我有如下结构:

 #ifdef DEBUG
 printf ( "array[%d] = %d\n", i, array[i] );
 #endif

要停用所有 DEBUG 代码,只需在调用之前注释掉您必须拥有的行#ifdef(源文件顶部,或在源文件顶部包含的包含标题中,格式良好)。#define DEBUG

希望有帮助。

于 2012-08-02T02:07:58.457 回答