C11的_Generic能否用于无参数场景实现函数重载?
用_Generic实现含无参函数的重载是否可行?
原代码的实现方式不可行,直接调用func()会触发编译错误,核心原因有两点:
- 调用
func()时,宏展开后_Generic((x), ...)中的x未定义,编译器会报“未声明的标识符x”错误; - 即使给
x设置默认值,_Generic的控制表达式也不能是空——C标准规定_Generic的第一个操作数必须是有效的表达式,不能为void或空。
要实现支持无参和int参数的函数重载,可以通过可变参数宏结合数组类型判断的方式修正,示例代码如下:
#include <stdio.h> void f1(void) { printf("F1\n"); } void f2(int n) { printf("F2 %d\n", n); } // 重载宏:支持无参或单个int参数 #define func(...) _Generic( \ &(int[]){0, ##__VA_ARGS__}, \ int(*)[1]: f1(), \ int(*)[2]: f2(__VA_ARGS__) \ ) int main(void) { func(); // 调用f1,输出F1 func(10); // 调用f2,输出F2 10 return 0; }
原理说明:
- 利用可变参数宏
__VA_ARGS__和##运算符:无参时##__VA_ARGS__会消除前面的逗号,生成数组(int[]){0};传入int参数时生成(int[]){0, 参数}。 - 通过
_Generic判断数组指针的类型:无参时数组大小为1,对应指针类型int(*)[1];传参时数组大小为2,对应指针类型int(*)[2],从而匹配到对应的函数调用。
内容的提问来源于stack exchange,提问作者Martel
相关产品推荐
相关产品推荐

