2012-01-26 15 views
1

私はこのtypedefを含んでいるいくつかのレガシーコードがあります。Cの#define文で、列挙型、構造体

typedef enum simple_op_enum { 
    #define SOP(OPCODE, NAME, FORM, SUIFOP) OPCODE , 
    #include "simple_ops.def" 
    LAST_OP 
} simple_op; 

の#includeファイルは、フォームのいくつかの行が含まれています。

/* no operand instructions */ 
SOP(NOP_OP, "nop ",  BASE_FORM, io_nop) 

トークン「をsimple_op 「構造体の後半に発生します。

typedef struct simple_instr_struct { 
    simple_op opcode;   /* the opcode */ 

私は理解していないいくつかのことがあります。

  1. #defineステートメントの最後にコンマを置くことによって達成されることはありますか?私はそれが違法だと思った。

  2. は私がsimple_instr_structにオペコードの値にアクセスするにはどうすればよい特にLAST_OP

  3. 、列挙型で何を達成していますか?

+0

http://stackoverflow.com/questions/264269/what-is-終わりに向かってa-good-reference-documenting-of-x-macro-of-cまたは-possib –

答えて

1
  1. を、プリプロセッサがSOP(x, y, z)のすべてのインスタンスを置き換えるものの一部です。

  2. simple_ops.defという内容の列挙型が作成されています。またLAST_OP最後の列挙値になります

typedef enum simple_op_enum { 
    NOP_OP , // <- notice the space before the comma, like the #define does 
    ...  // the others 
    LAST_OP 
} simple_op; 

:そのファイルの内容は、彼らがすべてのwに変わります、そしてenumはなりSOP(w, x, y, z)ですので。これはおそらくコードでLAST_OPを使用して、そこにいくつの列挙型の値(または最高の列挙型の値など)があるかを判断できます。

定義はそれだけでそれがためにそれを必要とするものは何でもするSOPを定義#includeのことをすべて同じ場所(ファイル)とコードでできるように、この#include事は巧妙なトリックです。その1つのファイルを変更すると、それを必要とするコード全体に影響が及ぼされ、コードは必要な方法でそれらを使用します。たとえば、コードには名前だけが必要な場合があるため、SOP#define SOP(w, x, y, z) xと定義して名前を抽出します。

のgcc -E file.cと-o file.txtを:

3)あなたは、彼らが展開する方法を確認するマクロについて疑いで、あなたは常にプリプロセッサを使用することができる場合simple_instr_struct_instance.opcode

0

それはオペコードを取って置くので、それが効果的

typedef enum simple_op_enum { 
NOP_OP, BLAH , WHATEVER , ANOTHER , 
LAST_OP 
} simple_op; 

列挙の点を生成する後列挙

列挙は、コンマseperatingを必要として、それはオペコードを抽出します利用可能なすべてのオペコードの列挙を持つことです。

LAST_OPはあなたがで終わるどのように多くのオペコードのようなものを知るために有用であり、また、列挙型リストの最後のものにはダングリングカンマがないことを意味します。

あなたは、構造体のインスタンスを持っている「何とか」なら、あなたはの#defineの終わりにblah.opcode = NOP_OP;

0

カンマを行くことによってそれを得るには、法的です。それはマクロの一部です。列挙型の定数はコンマで区切られており、このマクロはそれを心配しています。

列挙型を使用すると、列挙型の宣言で指定した値のいずれかを含めることができるだけのVARです。それらを数値に変換されているので、LAST_OPは、可能性の数に等しくなります。

struct simple_instr_struct a; 
a.opcode=LAST_OP; 
0
  1. コンマは、マクロを使用する場合に発生しますテキスト置換のほんの一部です:

    あなたは次のようにメンバーにアクセスすることができます。この場合、リストは、有効なenum構文を行いますように、各オペコードの後に​​コンマを追加します。あなたはCプリプロセッサを通して、あなたのソースコードを実行しているの出力を見て、同じことを見ることができます

    typedef enum simple_op_enum { 
        NOP_OP, 
        . 
        . 
        . 
        LAST_OP 
    } simple_op; 
    

  2. #define#includeの結果は次のようになります列挙です。 LAST_OPは、あなたの新しい列挙でちょうど最後のエントリです。

  3. あなたはその型の変数を定義する必要があります:

    struct simple_instr_struct myStruct; 
    

    、その後、あなたが気にフィールドにアクセス:それは違法ではありません

    myStruct.opcode 
    
+0

それは 'LAST_OP'の定義です - これは' enum'定数、特に最後の定数です。 –

1

を実行してそれにアクセスすることができます多くのヘッダファイルが含まれている場合がある

出力が大きくなりますが、あなたはそこにどこかであなたのマクロを見つけるだろう - おそらく

関連する問題