错误:宏名称必须使用#ifdef 0作为标识符

48

我有一个用C++编写的应用程序的源代码,我想用以下方式进行注释:

#ifdef 0
...
#endif

我得到了这个错误:

错误:宏名称必须是标识符

为什么会发生这种情况?


我认为你记错了;在C和C++中,#ifdef 0都是错误。 - Jonathan Leffler
7
你说得对,我记错了,在C语言中它不起作用。我不会删除这个问题,因为也许将来会有人犯同样的错误。 - Eduardo
1
@Eduardo 谢谢您没有删除这个问题。 - K_TGTK
5个回答

77

#ifdef指令用于检查预处理器符号是否被定义。标准(C11 6.4.2 Identifiers)规定标识符不能以数字开头:

identifier:
    identifier-nondigit
    identifier identifier-nondigit
    identifier digit
identifier-nondigit:
    nondigit
    universal-character-name
    other implementation-defined characters>
nondigit: one of
    _ a b c d e f g h i j k l m
    n o p q r s t u v w x y z
    A B C D E F G H I J K L M
    N O P Q R S T U V W X Y Z
digit: one of
    0 1 2 3 4 5 6 7 8 9

使用预处理器来阻止代码的正确形式是:
#if 0
: : :
#endif

您也可以使用:

#ifdef NO_CHANCE_THAT_THIS_SYMBOL_WILL_EVER_EXIST
: : :
#endif

但是你需要有信心,这些符号不会被除你之外的其他代码无意中设置。换句话说,不要使用像NOTUSEDDONOTCOMPILE这样的东西,因为其他人也可能使用。为了安全起见,应该优先选择#if选项。


我有一些代码偶尔需要编译,使用了-DNEVER_USED选项。我还没有调查为什么这么做 - 我不喜欢猜测。 - Jonathan Leffler
@Pax:实际上,C编译器很少允许这种表示法-如果允许的话,那么就是错误的。请参见我对问题的评论。我建议删除你的句子“很可能...”。 - Jonathan Leffler
并非所有的C编译器都符合ANSI标准。我使用过很多嵌入式编译器,它们允许各种各样的技巧。但我会修复它。 - paxdiablo

14

使用以下方法来评估表达式(常量0会被评估为false)。

#if 0
 ...
#endif

7

如果您没有遵循宏规则,也可能出现此错误。

例如:

#define 1K 1024 // Macro rules must be identifiers error occurs

原因:宏应该以字母开头,而不是数字。

更改为

#define ONE_KILOBYTE 1024 // This resolves 

2
#ifdef 0
...
#endif

#ifdef 期望使用宏而不是常量或表达式

#if 0
...
#endif

或者
#if !defined(PP_CHECK) || defined(PP_CHECK_OTHER)
..
#endif

如果使用 #ifdef,则会报告此错误。
#ifdef !defined(PP_CHECK) || defined(PP_CHECK_OTHER)
..
#endif

#ifdef 期望的是宏定义而不是宏表达式


1
请注意,如果您不小心键入了以下内容,也可能会出现此错误:


#define <stdio.h>

...代替...

#include <stdio.>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接