gpt4 book ai didi

c - 将零参数函数添加到 _Generic 宏

转载 作者:太空狗 更新时间:2023-10-29 17:11:49 26 4
gpt4 key购买 nike

我正在尝试在 C11 中使用 _Generic 宏生成重载函数,并且我已经停止了对零参数函数的支持,例如:

#define msg(_1) _Generic((_1), char*: msg_string, default: msg_none)(_1)

char* msg_none(void){
return moo_string("Have a nice day!");
}

char* msg_string(char* message){
int msglen = strlen(message);
char* result = malloc(msglen + 3);
sprintf(result, "<%s>\n", message);
return result;
}

现在编译运行:

printf("%s",msg("hello!"));

没有任何问题,但是:

printf("%s",msg());

抛出错误:

main.c:7:17: error: expected expression
printf("%s",msg());

我正在使用:

 clang --version
clang version 3.5.0 (tags/RELEASE_350/final)
Target: x86_64-pc-linux-gnu
Thread model: posix

GCC 抛出:

main.c:7:5: warning: implicit declaration of function ‘_Generic’

所以我明白 _Generic 不支持这个版本的 gcc:

gcc --version
gcc (Gentoo 4.8.3 p1.1, pie-0.5.9) 4.8.3

我的问题是否可以解决,或者我只是高估了 _Generic 的功能,或者我只需要升级我的编译器以正确使用此选项?

最佳答案

C 具有可以接收零个或多个参数的可变参数宏

#define msg(...) _Generic((__VA_ARGS__+0), char*: msg_string, default: msg_none)(__VA_ARGS__)

这里的 +0 还确保为您的字符串参数执行数组到指针的转换,您似乎假设了这一点。

后者很重要,因为如果选择表达式是数组,gcc 和 clang 目前的行为不同。

编辑:您可能还希望您的宏在有人传入 char const* 时起作用,因此您也应该添加这种情况。

关于c - 将零参数函数添加到 _Generic 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29801333/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com