2012-01-26 159 views
1

我有一個包含此類型定義了一些舊代碼:Ç#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. 什麼正被枚舉完成,尤其是LAST_OP

  3. 如何訪問一個simple_instr_struct操作碼的值?

+0

http://stackoverflow.com/questions/264269/what-is-一個好的參考文檔化圖案-的使用-的-X-宏-在-C-或-possib –

回答

1
  1. 這是不是非法的,它是預處理器將用所有SOP(x, y, z)替換的實例的一部分。

  2. 它創建一個枚舉與simple_ops.def中的內容。由於該文件的內容是SOP(w, x, y, z)他們都將變成w,和enum將是:

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

這也使得LAST_OP最後一個枚舉值。這可能是代碼可以使用LAST_OP來確定有多少枚舉值(或最高的枚舉值,或類似的東西)。

這個#include事情是一個聰明的把戲,以便定義可以在同一個地方(文件)和代碼#include它只是定義SOP是它需要的任何東西。然後修改這個文件會影響需要它的整個代碼,並且代碼以任何需要的方式使用它們。例如,某些代碼可能只需要該名稱,因此它會將SOP定義爲#define SOP(w, x, y, z) x以提取名稱。

3)你可以通過做simple_instr_struct_instance.opcode

0

將解壓出來的操作碼爲枚舉

枚舉需要以逗號分隔條件,因此其採取的操作碼,並把一個,它有效地產生

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

後枚舉的點是有一個可用的所有操作碼的枚舉。

LAST_OP對於知道最終結果有多少個操作碼很有用,也意味着枚舉列表中最後一項沒有懸空的逗號。

如果你有結構,「嗒嗒」的一個實例,則通過的#define月底去blah.opcode = NOP_OP;

0

逗號得到它是合法的。它是宏的一部分。枚舉常量用逗號分隔,這個宏擔心這一點。

enum只是一個var,它可以包含您在枚舉聲明中指定的任何值。因爲它們被轉換爲數字,LAST_OP將等於可能性的數量。

您可以訪問該成員,如:

struct simple_instr_struct a; 
a.opcode=LAST_OP; 
0
  1. 逗號只是文本替換使用宏時將發生的一部分。在這種情況下,在每個操作碼之後添加一個逗號,以便該列表生成有效的enum語法。

  2. #define#include的結果是一個枚舉,看起來像:

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

    您可以通過查看通過C預處理程序運行源代碼的輸出看到的一樣。 LAST_OP只是新枚舉中的最後一個條目。

  3. 你需要定義類型的變量:

    struct simple_instr_struct myStruct; 
    

    ,然後訪問您所關心的領域:

    myStruct.opcode 
    
+0

這是'LAST_OP'的定義 - 它是'enum'常數,特別是最後一個。 –

1

如果對宏疑問,您可以隨時使用預處理程序訪問它,看看他們如何拓展:

的gcc -E file.c -o file.txt的

輸出將是大的,如果有包括許多頭文件,但你會發現你的宏中的某個地方 - 可能接近尾聲