2011-09-28 61 views
1

在我定義了一個.h文件中返回一個typedef:問題試圖在C

#define PAIR_TYPE(type1, type2)\ 
    typedef struct {  \  // added \ after edit 
     type1 first;  \  // added \ after edit 
     type2 second;  \  // added \ after edit 
    };  // added ; after edit   
#define MAKE_PAIR(val1, val2) {val1, val2} 
PAIR_TYPE(char *, uint32_t) mypair; 
mypair foo(); 

在.c文件我用這樣的:

mypair foo() 
{ 
    mypair p; 
    uint32_t bar = calculate(); 
    p = MAKE_PAIR("normal", target); 
    return p; 
} 

但是我得到這個錯誤:

error: expected expression before ‘{’ token 

它指向的行是:

p = MAKE_PAIR("normal", target); 

我不知道它爲什麼說'{'!!!那條線上沒有'{'。

+0

在預處理程序完成之後有一個{提示:它將用...替換MAKE_PAIR)。我建議你看看預處理後的輸出,你的編譯器幾乎肯定有一個選項標誌只能預處理。 – Vicky

+0

我看到....感謝您的回答 – mahmood

回答

7

您需要以後在線條更加反斜槓 '{'

#define PAIR_TYPE(type1, type2)\ 
    typedef struct {\ 
    type1 first;\ 
    type2 second;\ 
    } 
+0

我編輯了帖子。這次我得到錯誤:未知類型名稱'mypair',它指向mypair foo(); – mahmood

+0

不要在宏定義中使用分號。也不要在宏中發表評論。它會咬你。 – wildplasser

+0

你的意思是哪個分號?我只在帖子中添加了評論。 – mahmood

3

是的,有!但是預處理器的魔法對你來說是隱藏的。記住,the preprocessor is evil,你肯定會過度使用它。

預處理器只是做文本替換,所以編譯器看到的代碼實際上是:

p = {"normal", target}; 

這不是有效的C語法。在那裏,請參閱'{'。 這句法僅在初始化有效,不分配:

mypair a = {"a", 1}; /* ok */ 
a = {"a", 1}; /* error */ 
+0

感謝您的提示。它真的幫助我:) – mahmood

0

在你PAIR_TYPE宏,你需要在年底擺脫分號,讓你給該類型名稱是類型定義的一部分。現在,當你這樣做:

PAIR_TYPE(char *, uint32_t) mypair; 

..你得到:

typedef struct { 
    char * first; 
    uint32_t second; 
}; mypair; 

..這有}mypair不應該有之間的分號。

您還需要爲您的MAKE_PAIR宏使用強制轉換才能使用它。眼下,該行:

p = MAKE_PAIR("normal", target); 

..expands到:

p = {"normal", target}; 

..這是行不通的。但是,如果你添加一個投:

p = (mypair)MAKE_PAIR("normal", target); 

..then展開線是:

p = (mypair){"normal", target}; 

因爲類型轉換..這可以工作,告訴編譯器什麼{}之間的字段應該是。雖然請注意,您將第一個字段中的char *設置爲文字"normal",而不是複製該字符串。