2

PC-Lint エラー メッセージ (e136) が表示されました。

Illegal macro name  -- The ANSI standard restricts the use of certain names as
macros.  defined is on the restricted list.

ANSI C 仕様でそのようなリストへの参照を見つけることができません。このリストは PC-Lint 自体によって管理されていますか、それとも ANSI C で禁止されているマクロ名の公式リストはありますか?

4

1 に答える 1

2

実装に予約されているようなマクロ名を使用していて_HEADER_FILE_H_、PC Lint がこのエラーについて通知している可能性があります。

水平スクロール バーを削除した後、悪用されている名前は であることがわかりますdefined。C プリプロセッサは、次の名前definedを使用します。

#if defined(SOME_MACRO)

したがって、次のように書くことはできません。

#define defined(x)   ((x) != 0)

または類似のもの。少なくともプリプロセッサ ディレクティブではキーワードとして扱うdefined必要があります (プリプロセッサ ディレクティブの外ではマクロとして扱うことはできません)。これを変数名として使用することもできますが (変数名としてendifanddefineおよびも使用できelifます)、使用せずに予約語として扱うことをお勧めします。


C11 標準 (ISO/IEC 9899:2011) には次のように記載されています。

7.1.3 予約済み識別子

¶1 各ヘッダーは、関連する副次節にリストされているすべての識別子を宣言または定義し、オプションで、関連する将来のライブラリ指示の副次節にリストされている識別子と、任意の使用またはファイルスコープ識別子として使用するために常に予約されている識別子を宣言または定義します。

  • アンダースコアと大文字または別のアンダースコアで始まるすべての識別子は、常に予約されています。
  • アンダースコアで始まるすべての識別子は、通常の名前空間とタグ名空間の両方で、ファイル スコープの識別子として使用するために常に予約されています。
  • 以下の節 (将来のライブラリの指示を含む) のいずれかの各マクロ名は、関連付けられたヘッダーのいずれかが含まれている場合、指定されたとおりに使用するために予約されています。別段の明示的な記載がない限り(7.1.4 を参照)。
  • 次の節 (将来のライブラリの指示を含む) のいずれかで外部リンケージを持つすべての識別子と errno は、常に外部リンケージを持つ識別子として使用するために予約されています。184)
  • 次の節のいずれかにリストされているファイル スコープを持つ各識別子 (将来のライブラリの指示を含む) は、マクロ名として、および関連付けられたヘッダーのいずれかが含まれている場合は、同じ名前空間内のファイル スコープを持つ識別子として使用するために予約されています。

¶2 他の識別子は予約されていません。プログラムが予約されているコンテキストで識別子を宣言または定義する場合 (7.1.4 で許可されている場合を除く)、または予約された識別子をマクロ名として定義する場合、動作は未定義です。

¶3 プログラム#undefが上記の最初のグループの識別子のマクロ定義を ( で) 削除した場合、動作は未定義です。

184)外部リンケージを持つ予約済み識別子のリストには、、、、およびmath_errhandlingが含まれます。setjmpva_copyva_end

標準の以前の版では、同等の一連の制限に対して非常によく似た表現が使用されていました。

于 2013-08-21T00:03:57.690 に答える