如果我定义
#if SOMETHING
#endif
而且我还没有在任何地方定义一些东西。#if 中的代码会编译吗?
当参数表达式中使用的名称#if
未定义为宏时(在所有其他宏替换完成后),将其替换为0
。这意味着您#if SOMETHING
将被解释为#if 0
. 下面的代码#if
将被预处理器删除。
该规则也适用于更复杂的表达式。你可以做
#define A 42
#if A + B
这将评估为#if 42
,因为未知名称B
被解释为0
不,只要 SOMETHING 也不是预定义的宏之一或在命令行上传递给编译器的宏。
我认为在 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
不,因为作为一个未定义的宏,它不一定会被任何东西替换......但这可能是编译器特定的,并且不被信任。
您可能想使用:
#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
希望有帮助。