检测C编译器是否支持语句表达式

时间:2016-12-07 15:50:42

标签: c gcc clang

有没有办法检测一个编译器(我有一个当前的GCC,它有一个和一个没有它的旧的clang)没有实现语句表达式,所以我可以做这样的事情:

#pageBraker

3 个答案:

答案 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