2016-07-30 79 views
0

我有如下宏:如何編寫宏以避免重新定義?

#define my_add_property(ret, name, value) \ 
    object tmp; \ 
    tmp = *value; \ 
    add_property(ret, name, &tmp); 

現在我用宏在後續功能:

void func() { 
    object *ret; 
    my_add_property(ret, "key", my_func1()); 
    my_add_property(ret, "value", my_func2()); 
} 

這將有make errortmp被重新定義。

所以我想用object tmp##name,但是如果名字是"key"tmp##name將是tmp"key"。我應該怎麼寫tmp##nametmpkey而不是tmp"key"的宏?謝謝!

+2

我喜歡它的人如何走出去他們的方式使代碼難以閱讀和維護。他們喜歡艱苦的生活嗎? –

+2

是否將'return'作爲參數的名稱是一個好主意? –

+0

爲什麼不使用'add_property(ret,「key」,my_func1())'?一旦'func()'完成,指向'tmp'的指針變得毫無意義。讓my_add_property()放在第一位有什麼意義?也許你真正想要的是:'object * tmp = malloc(sizeof(object)); * TMP = *值; add_property(RET,名稱,TMP)'? – user172818

回答

4

您可以創建宏內部一個新的範圍,使得tmp僅通過包裝實現在do {} while(0),例如住了很短的時間量:

#define my_add_property(return, name, value) do { \ 
    object tmp;         \ 
    tmp = *value;        \ 
    add_property(return, name, &tmp); } while(0) 
+4

通常的形式是'#define MACRO(args)do {something; (0)'。這樣,如果你決定在'if' /'else' /'while'/'for'後面決定取消括號,你不會得到令人討厭的驚喜,並且在表達式中使用這樣的宏時,你會得到更好的錯誤消息。也就是說,沒有任何理由不使用靜態內聯函數。 – 2016-07-30 10:29:29

+0

@Rhymoid非常感謝,你是對的! – thinkerou

+0

@slugonamission非常感謝,沒關係。 – thinkerou