比如gcc 4.7有一个新特性——Wnarrowing。在 configure.ac 中,如何测试当前 gcc 是否支持某个功能?
有一个 file在 gnulibc 中,但对我来说意义不大。
最佳答案
gcc 和 clang 都支持 -W[no-]narrowing
和 -W[no-]error=narrowing
选项。
使用 -std=c++11
,gcc 默认发出一个警告,而 clang 默认发出一个错误。即使你只提到 gcc,我认为你可以将功能检查扩展到像 clang 这样试图提供相同选项和扩展的编译器。这可能也包括英特尔的 icc。
假设您选择了带有 AC_PROG_CXX
的 C++ 编译器,并确保 it's using the C++11 standard .
ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS="$CXXFLAGS -Werror -Wno-error=narrowing"
AC_LANG_PUSH([C++])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],
[[int i {1.0}; (void) i;]])],
[ac_cxx_warn_narrowing=1], [ac_cxx_warn_narrowing=0])
AS_IF([test $ac_cxx_warn_narrowing -ne 0],
[AC_MSG_RESULT(['$CXX' supports -Wnarrowing])])
AC_LANG_POP([C++])
CXXFLAGS="$ac_save_CXXFLAGS"
只有在以下情况下编译才会成功:1) 编译器支持-Wnarrowing
相关选项,这意味着它支持-Werror
,并且:2) 识别C++11 初始化语法。
通常,configure.ac
脚本和传递给 configure 的标志应该避免 -Werror
,因为它破坏了太多的内部测试。在这种情况下,我们确保除了缩小之外没有其他警告,这就是为什么需要 (void) i;
来防止有关未使用变量的警告。
关于c++ - 如何检查 configure.ac 中的特定 gcc 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24819461/