45

我有一个用 C++ 编写的应用程序的源代码,我只想使用以下方法评论一些东西:

#ifdef 0
...
#endif

我得到这个错误

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

为什么会这样?

4

5 回答 5

71

#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应该首选该选项。

于 2009-01-09T01:38:49.833 回答
14

使用以下方法计算表达式(常量 0 计算为假)。

#if 0
 ...
#endif
于 2009-01-09T01:33:51.340 回答
6

如果您不遵守 marco 规则,也会出现此错误

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

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

改成

#define ONE_KILOBYTE 1024 // This resolves 
于 2011-11-09T05:37:48.590 回答
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 期望宏而不是宏表达式

于 2014-05-28T13:28:59.300 回答
1

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

#define <stdio.h>

...代替...

#include <stdio.>
于 2013-02-02T23:00:07.783 回答