C _Generic和char数组

时间:2018-01-24 08:24:40

标签: c generics

我有一个通用表达式(在宏中):

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 *

1 个答案:

答案 0 :(得分:5)

这个问题是由于引入_Generic的C11文本中的含糊不清造成的。它现在由委员会解决,因为期望执行数组到指针的转换以确定匹配类型。

目前,您可以通过在执行此转换的表达式中使用actual来解决此问题。我建议

bool equal = _Generic(                                                                           
        (actual)+0,                                                                               
        default:  actual == expected,                                                     
        char *:         strcmp((char *)actual, (char *)expected) == 0                           
);
顺便说一下,你的代码不是完全类型保存,因为它没有检查expected的类型。我试着让第二个_Generic确保这一点。