C 为什么这个通用表达式会过时?
最近我回答了一些关于如何实现结构成员的复杂常量正确性的问题。这样做时,我使用了泛型表达式并遇到了奇怪的行为。以下是示例代码:C 为什么这个通用表达式会过时?,c,generic-programming,c11,C,Generic Programming,C11,最近我回答了一些关于如何实现结构成员的复杂常量正确性的问题。这样做时,我使用了泛型表达式并遇到了奇怪的行为。以下是示例代码: struct A { union { char *m_ptrChar; const char *m_cptrChar; } ; }; #define ptrChar_m(a) _Generic(a, struct A *: a->m_ptrChar, \
struct A
{
union {
char *m_ptrChar;
const char *m_cptrChar;
} ;
};
#define ptrChar_m(a) _Generic(a, struct A *: a->m_ptrChar, \
const struct A *: a->m_cptrChar, \
struct A: a.m_ptrChar, \
const struct A: a.m_cptrChar)
void f(const struct A *ptrA)
{
ptrChar_m(ptrA) = 'A'; // NOT DESIRED!!
}
在GCC和Clang上,当a
的类型必须是struct a
时,通用表达式选择这种情况,这没有任何意义。当我评论最后两个案例时,虽然效果不错。这是为什么?是什么虫子
clang上的确切错误消息如下:
test.c:17:5: error: member reference type 'const struct A *' is a pointer; did you mean to use '->'?
ptrChar_m(ptrA) = 'A'; // NOT DESIRED!!
^
test.c:12:45: note: expanded from macro 'ptrChar_m'
struct A: a.m_ptrCHar, \
^
test.c:17:5: error: member reference type 'const struct A *' is a pointer; did you mean to use '->'?
ptrChar_m(ptrA) = 'A'; // NOT DESIRED!!
^
test.c:13:51: note: expanded from macro 'ptrChar_m'
const struct A: a.m_cptrChar)
^
test.c:17:21: error: cannot assign to variable 'ptrA' with const-qualified type 'const struct A *'
ptrChar_m(ptrA) = 'A'; // NOT DESIRED!!
^
test.c:15:24: note: variable 'ptrA' declared const here
void f(const struct A *ptrA)
^
test.c:23:18: error: invalid application of 'sizeof' to a function type [-Werror,-Wpointer-arith]
return sizeof(main);
4 errors generated.
虽然未计算不匹配的选择,但编译器仍在编译代码。因此,不允许在指向结构的指针上使用
运算符
如果输入表达式始终是变量,则可以获取表示结构实例的变量的地址
#define AptrChar_m(a) _Generic(a, struct A *: a->m_ptrChar, \
const struct A *: a->m_cptrChar)
#define ptrChar_m(a) AptrChar_m(_Generic(a, struct A *: a, \
const struct A *: a, \
struct A: &a, \
const struct A: &a))
这是一个很好的问题,但将编译器输出作为屏幕截图并不太好。你就不能把文本复制粘贴到问题中吗?我可以回答你的问题吗