向_Generic宏添加零参数函数

muc*_*cka 7 c macros gcc clang c11

我试图在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;
}
Run Code Online (Sandbox Code Playgroud)

目前正在编译和运行:

printf("%s",msg("hello!"));
Run Code Online (Sandbox Code Playgroud)

没有任何问题,但是:

printf("%s",msg());
Run Code Online (Sandbox Code Playgroud)

抛出错误:

main.c:7:17: error: expected expression
printf("%s",msg());
Run Code Online (Sandbox Code Playgroud)

我在用:

 clang --version
 clang version 3.5.0 (tags/RELEASE_350/final)
 Target: x86_64-pc-linux-gnu
 Thread model: posix
Run Code Online (Sandbox Code Playgroud)

海湾合作委员会抛出:

main.c:7:5: warning: implicit declaration of function ‘_Generic’
Run Code Online (Sandbox Code Playgroud)

所以我理解_Generic不支持这个版本的gcc:

gcc --version
gcc (Gentoo 4.8.3 p1.1, pie-0.5.9) 4.8.3
Run Code Online (Sandbox Code Playgroud)

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

Jen*_*edt 3

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

#define msg(...) _Generic((__VA_ARGS__+0), char*: msg_string, default: msg_none)(__VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:如果有人传入 a,您可能还希望宏能够正常工作,char const*因此您也应该添加该情况。