我想知道 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)
#define执行简单的字符串替换。它不依赖于上下文。你不能这样做。
答案 1 :(得分:0)
我甚至不确定您要定义哪个符号,s1
或s2
。这不是真的很重要,在任何一种情况下,你都要替换一个你需要的名字,这样就行不通了。
答案 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启用。