インクルードガードを設定する従来の方法は何ですか? 私は通常、それらを次のように記述します(例:.h):
#ifndef _EXAMPLE_H_
#define _EXAMPLE_H_
#include "example.h"
#endif
アンダースコアの規則は重要ですか? これをグーグルで検索すると、矛盾する情報が表示されました。_EXAMPLE_H_
ヘッダーの名前と一致する必要がありますか?
インクルードガードを設定する従来の方法は何ですか? 私は通常、それらを次のように記述します(例:.h):
#ifndef _EXAMPLE_H_
#define _EXAMPLE_H_
#include "example.h"
#endif
アンダースコアの規則は重要ですか? これをグーグルで検索すると、矛盾する情報が表示されました。_EXAMPLE_H_
ヘッダーの名前と一致する必要がありますか?
Does underscore convention matter?
はい。それは重要です。
先頭にアンダースコアがあり、その後に大文字が続く識別子は、実装のために予約されています。したがって、あなたが持っているものは未定義の動作を引き起こします。
以下は、識別子の命名に関する C 標準の仕様です ( C11 ドラフト)。
7.1.3 予約済み識別子
各ヘッダーは、関連する副次節にリストされているすべての識別子を宣言または定義し、オプションで、関連する将来のライブラリ指示の副次節にリストされている識別子と、任意の使用またはファイルスコープ識別子として使用するために常に予約されている識別子を宣言または定義します。
— アンダースコアと大文字または別のアンダースコアで始まるすべての識別子は、常に使用のために予約されています。
— アンダースコアで始まるすべての識別子は、通常の名前空間とタグ名空間の両方で、ファイル スコープの識別子として使用するために常に予約されています。
— 以下の副次節 (将来のライブラリの指示を含む) のいずれかの各マクロ名は、関連するヘッダーのいずれかが含まれている場合、指定されたとおりに使用するために予約されています。別段の明示的な記載がない限り(7.1.4 を参照)。— 以下の節のいずれかにある外部リンケージを持つすべての識別子 (将来のライブラリの指示を含む) および errno は、外部リンケージを持つ識別子として使用するために常に予約されています.184) — 以下の節のいずれかにリストされているファイルスコープを持つ各識別子 (将来のライブラリの指示) は、マクロ名として、および関連付けられたヘッダーのいずれかが含まれている場合、同じ名前空間内のファイル スコープの識別子として使用するために予約されています。
他の識別子は予約されていません。プログラムが予約されているコンテキストで識別子を宣言または定義する場合 (7.1.4 で許可されている場合を除く)、または予約された識別子をマクロ名として定義する場合、動作は未定義です。
プログラムが上記の最初のグループの識別子のマクロ定義を (#undef で) 削除した場合、動作は未定義です。
上記のいずれにも違反しない限り、インクルード ガード名は任意であり、ヘッダー ファイルの名前である必要はありません。しかし、通常、私が見たり使用したりする規則は、ヘッダーファイル名と同じ名前を使用して、不必要な混乱を引き起こさないようにすることです。