この C コードを解釈するにはどうすればよいですか。
typedef enum {
#include <test.h>
enum1,
enum2,
…
} test_enum;
test.h には多くのマクロが含まれています。これを理解する方法は?
列挙型の定義には、ヘッダー ファイル内で定義されたマクロが必要であることを意味しますか?
どこにでも#include
現れる?
この C コードを解釈するにはどうすればよいですか。
typedef enum {
#include <test.h>
enum1,
enum2,
…
} test_enum;
test.h には多くのマクロが含まれています。これを理解する方法は?
列挙型の定義には、ヘッダー ファイル内で定義されたマクロが必要であることを意味しますか?
どこにでも#include
現れる?
#include
ステートメントは、任意の行に表示できます。ほとんどの場合、宣言全体を含めるために使用されます。ただし、任意のテキストを挿入するために使用できます。
test.h
内で宣言される名前のリストが含まれている可能性がありますenum
。また、マクロ定義やステートメントなどのプリプロセッサ ステートメントを含めることもできます#if … #endif
。
test.h
それをさらに理解するために、の内容を表示する必要があります。
#include
実際のコードで#define
はなく、プリプロセッサ ディレクティブです。
それらはどこにでも置くことができます (リテラル文字列の一部を除く) - 一部のコンパイラは他のものよりも面倒です (つまり、# は列 0 にある必要があります)。
プリプロセッサは必要に応じてこれらを展開し、コンパイラはそれを認識します。あなたの場合の意味については、test.hの内容によって異なります
通常、すべてのプリプロセッサが展開された状態でコードを表示するコンパイラオプションがあります(以前は gcc で -e または -E だったと思います)。
#include ディレクティブを使用すると、インクルード ファイルの内容が #include ディレクティブの位置に正確に配置されます。結果のコードは、展開が行われた後のものであり、任意の有効な言語構造にすることができます。
含まれるファイルに次のものが含まれている場合:
enum_a,
enum_b,
enum_c,
含めると、コードは次のようになります。
typedef enum {
enum_a,
enum_b,
enum_c,
enum1,
enum2,
…
} test_enum;
これは有効な構成です。
#include ディレクティブはどこにでも表示できます。これを参照してください。
プリプロセッサ ステートメントはどこでも使用でき、単純なテキスト置換です。処理されたコードが有効な C コードであるかどうかは、プリプロセッサではなくコンパイラによってチェックされます。
コンパイラによっては、プリプロセッサによって行われた変更を確認できます。
gcc の場合、これが-E
フラグになるため、ソース コードを
gcc -E in.c
test.h
挿入して処理した後、enum 宣言にどの変更コードが含まれているかを確認できます。