有没有办法检测一个编译器(我有一个当前的GCC,它有一个和一个没有它的旧的clang)没有实现语句表达式,所以我可以做这样的事情:
#pageBraker
答案 0 :(得分:1)
语句表达式(这是您的问题似乎是关于)不是C语言的标准功能。也不是__typeof__
,BTW。
这意味着如果您想要这样的东西,那么最佳策略可能是手动定义的宏,这将允许(或禁止)在代码中使用这些功能。您将为那些实现这些非标准功能的特定编译器手动指定宏。 (这基本上只是GCC。)
答案 1 :(得分:1)
正如AnT在答案中所说,它们不是标准的一部分。不幸的是,我在GCC中找不到任何功能测试宏的证据,所以最好的办法是检查以确保你使用的是{C}标准的gnu
变体和GCC版本3或更高版本(这是添加语句表达式的时候)
#if !__STRICT_ANSI__ && __GNUC__ >= 3
/* use statement expressions */
#else
/* use... something else? */
#endif
答案 2 :(得分:1)
我会像autoconf那样做这样的事情:如果编译成功,尝试编译一个块并将宏定义输出到你的config.h(或者你拥有的任何东西):
echo 'int main(){ int x = ({ puts(""); 32; }); return x; }' > tmp.c
if cc -c tmp.c; then #-c only to save on linking time
echo '#define HAVE_STMT_EXPR 1'
fi