C _Generic和char数组

fad*_*bee 2 c generics

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

int equal = _Generic(                                                                           
        (actual),                                                                               
        unsigned long:  actual == expected,                                                     
        int:            actual == expected,                                                     
        unsigned char:  actual == expected,                                                     
        char *:         strcmp((char *)actual, (char *)expected) == 0                           
);                                                                                              
Run Code Online (Sandbox Code Playgroud)

当我actual使用char [12] 扩展它时它适用于某些体系结构/编译器,但在某些我得到错误:

error: controlling expression type 'char [12]' not compatible with any generic association type
Run Code Online (Sandbox Code Playgroud)

如何在不为每个char数组长度写一行的情况下处理这个问题?即char[0],char[1],char[2]...

强制char数组衰减成指针可以解决问题,但我无法将此宏更改为函数.有没有办法强迫腐烂?我试过了*&actual,但它没有导致char *.

Jen*_*edt 5

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

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

bool equal = _Generic(                                                                           
        (actual)+0,                                                                               
        default:  actual == expected,                                                     
        char *:         strcmp((char *)actual, (char *)expected) == 0                           
);
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你的代码不是完全类型保存,因为它不检查类型expected.我试着让第二个_Generic确保这一点.

  • 事实上,@ chux实际上是,至少如果你想将这段代码插入一个对所有情况都有效的宏中.`_Generic`的所有分支必须有效.因此,如果表达式满足整数类型,则对"strcmp"的调用必须仍然有效,否则编译器将会调用. (2认同)