2012-05-04 27 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具有有限的不完全支持。