web-dev-qa-db-ja.com

エラー:マクロ名は#ifdef 0を使用した識別子でなければなりません

C++で記述されたアプリケーションのソースコードがあり、次のコードを使用してコメントしたいだけです。

#ifdef 0
...
#endif

そして、私はこのエラーを受け取ります

エラー:マクロ名は識別子でなければなりません

なんでこんなことが起こっているの?

34
Eduardo

#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

ただし、シンボルがnotでないことを、自分以外のコードによって誤って設定されることを確信する必要があります。つまり、NOTUSEDDONOTCOMPILEなど、他の人も使用するようなものは使用しないでください。安全のために、#ifオプションを優先する必要があります。

60
paxdiablo

以下を使用して式を評価します(定数0はfalseと評価されます)。

#if 0
 ...
#endif
13
tvanfosson

このエラーは、マルコルールに従っていない場合にも発生する可能性があります

お気に入り

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

理由:マクロは数字ではなく文字で始まる必要があります

への変更

#define ONE_KILOBYTE 1024 // This resolves 
5
Fooo
#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はマクロ表現ではなくマクロを予期する場所

2
Deepak Reddy

誤って入力した場合にも、このエラーが発生する可能性があることに注意してください。

#define <stdio.h>

...の代わりに...

#include <stdio.>
1
Drew Noakes