我有一个通用表达式(在宏中):
int equal = _Generic(
(actual),
unsigned long: actual == expected,
int: actual == expected,
unsigned char: actual == expected,
char *: strcmp((char *)actual, (char *)expected) == 0
);
当我使用actual
作为char [12]进行扩展时,它适用于某些体系结构/编译器,但在某些情况下我得到错误:
error: controlling expression type 'char [12]' not compatible with any generic association type
如何在不为每个char数组长度写一行的情况下处理这个问题?即char[0]
,char[1]
,char[2]
...
强制char数组衰减成指针可以解决问题,但是我不能将这个宏改成函数。有没有办法强迫腐烂?我尝试过*&actual
,但不会产生char *
。
答案 0 :(得分:5)
这个问题是由于引入_Generic
的C11文本中的含糊不清造成的。它现在由委员会解决,因为期望执行数组到指针的转换以确定匹配类型。
目前,您可以通过在执行此转换的表达式中使用actual
来解决此问题。我建议
bool equal = _Generic(
(actual)+0,
default: actual == expected,
char *: strcmp((char *)actual, (char *)expected) == 0
);
顺便说一下,你的代码不是完全类型保存,因为它没有检查expected
的类型。我试着让第二个_Generic
确保这一点。