C选择性#define

时间:2012-05-04 21:50:56

标签: c c-preprocessor

我想知道 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);
}

3 个答案:

答案 0 :(得分:0)

#define执行简单的字符串替换。它不依赖于上下文。你不能这样做。

答案 1 :(得分:0)

我甚至不确定您要定义哪个符号,s1s2。这不是真的很重要,在任何一种情况下,你都要替换一个你需要的名字,这样就行不通了。

答案 2 :(得分:0)

您可以使用_Generic语法在C11中执行此操作。

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

您无法在C99或C89中执行此操作。我还不知道有任何编译器支持C11,所以这段代码还不会编译一两年。来自GCC文档(source):

  

GCC对此标准的部分内容的支持有限,使用-std = c11或-std = iso9899:2011启用。