2012-05-04 28 views
-1

我想知道C是否允許設置選擇性#define。 下面是我通過選擇性的意思是: 如果我有定義的結構:C選擇#define

typedef struct mystruct{ 
int (*pointer_function)(struct mystruct* ,struct mystruct); 
... 
} mystruct; 

// and I have: 
int main() { 
mystruct s1, s2; 
// when I do: 
s1 = s2; 
// I want my #define to recognize that on the left side 
// I have mystruct type and use s1.pointer_function(&s1,s2); 
} 

回答

0

#定義進行簡單的字符串替換。它不依賴於上下文。你不能這樣做。

0

我甚至不確定你會定義哪個符號,s1s2。這不是真的很重要,無論哪種情況,您都需要替換您需要的名稱之一,以免失效。

0

您可以在C11中使用_Generic語法來執行此操作。

#define MY_MACRO(x, y) _Generic((x), \ 
    mystruct: (x).pointer_function(&(x), (y)), \ 
    ) 

你不能在C99或C89中做到這一點。我不知道任何具有良好的C11支持的編譯器,所以這段代碼不會編譯一年或兩年。從GCC文檔(source):2011:此標準的部位,用-std = C11或-std = iso9899啓用

GCC具有有限的不完全支持。