2

この C コードを解釈するにはどうすればよいですか。

typedef enum {
    #include <test.h>
    enum1,
    enum2,
    …
} test_enum;

test.h には多くのマクロが含まれています。これを理解する方法は?

列挙型の定義には、ヘッダー ファイル内で定義されたマクロが必要であることを意味しますか?

どこにでも#include現れる?

4

4 に答える 4

6

#includeステートメントは、任意の行に表示できます。ほとんどの場合、宣言全体を含めるために使用されます。ただし、任意のテキストを挿入するために使用できます。

test.h内で宣言される名前のリストが含まれている可能性がありますenum。また、マクロ定義やステートメントなどのプリプロセッサ ステートメントを含めることもできます#if … #endif

test.hそれをさらに理解するために、の内容を表示する必要があります。

于 2013-05-09T01:29:29.650 に答える
2

#include実際のコードで#defineはなく、プリプロセッサ ディレクティブです。

それらはどこにでも置くことができます (リテラル文字列の一部を除く) - 一部のコンパイラは他のものよりも面倒です (つまり、# は列 0 にある必要があります)。

プリプロセッサは必要に応じてこれらを展開し、コンパイラはそれを認識します。あなたの場合の意味については、test.hの内容によって異なります

通常、すべてのプリプロセッサが展開された状態でコードを表示するコンパイラオプションがあります(以前は gcc で -e または -E だったと思います)。

于 2013-05-09T01:30:29.210 に答える
2

#include ディレクティブを使用すると、インクルード ファイルの内容が #include ディレクティブの位置に正確に配置されます。結果のコードは、展開が行われた後のものであり、任意の有効な言語構造にすることができます。

含まれるファイルに次のものが含まれている場合:

enum_a,
enum_b,
enum_c,

含めると、コードは次のようになります。

typedef enum {
    enum_a,
    enum_b,
    enum_c,
    enum1,
    enum2,
    …
} test_enum;

これは有効な構成です。

#include ディレクティブはどこにでも表示できます。これを参照してください

于 2013-05-09T01:52:09.177 に答える
0

プリプロセッサ ステートメントはどこでも使用でき、単純なテキスト置換です。処理されたコードが有効な C コードであるかどうかは、プリプロセッサではなくコンパイラによってチェックされます。

コンパイラによっては、プリプロセッサによって行われた変更を確認できます。

gcc の場合、これが-Eフラグになるため、ソース コードを

gcc -E in.c 

test.h挿入して処理した後、enum 宣言にどの変更コードが含まれているかを確認できます。

于 2013-05-09T01:32:43.977 に答える