C11 _通用用法
我试图学习如何使用“新”C11通用表达式,但我碰到了一堵墙.
请考虑以下代码: #include <stdlib.h> #include <stdio.h> #define test(X,Y,c) _Generic((X), double: _Generic((Y), double * : test_double, default: test_double ), int: _Generic((Y), int * : test_int, default: test_int ) ) (X,c) int test_double(double a,double *b,int c); int test_int(int a,int *b,int c); int test_double(double a,int c) { return 1; } int test_int(int a,int c) { return 2; } int main() { double *t = malloc(sizeof(double)); int *s = malloc(sizeof(int)); int a1 = test(3.4,t,1); int i = 3; int a2 = test(i,s,1); printf("%dt",a1); printf("%dn",a2); return 0; } 这一切都完美有效,但我不明白为什么“_Generic((Y),…”中的默认情况是必要的,而我可以在“_Generic((X),…”的末尾省略它)没有后果. 事实上,如果我删除这两个默认值,我会得到一个错误(gcc 5.4.0)说“类型’double *’的选择器与任何关联都不兼容”而宏扩展“int a1 = test(3.4,1 );”宏扩展测试(i,1)与“int *”相同 “默认”真的有必要还是我错过了什么? 解决方法
TL; DR
选择在编译时发生,但这并不意味着丢弃其他(未选择)代码.它仍然必须有效,这意味着……
(Source) 这是一个令人惊讶的: 没有“第一个Y”的默认情况: #define test(X, double * : test_double ), default: test_default ) ) (X,c) 我收到了这个错误:
请注意,它抱怨int *不兼容!为什么? int a2 = test(i,1); X的类型为int,类型为int *的Y. 现在是重要的部分:扩展无条件地发生.因此,即使X是int类型,X的第一个关联(当它是double类型时)必须是一个格式良好的程序.因此,如果Y是一个int *,则必须形成以下内容: _Generic((Y), double * : test_double ), 因为int *不是double *,所以事情在这里打破. 我只是在查看标准(实际上是N1570)并且找不到任何实际指定这种行为的东西.我想在这种情况下可以报告一个缺陷,标准对此太过模糊.我现在正试图这样做. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |