c++ - 如何检查 configure.ac 中的特定 gcc 功能

标签 c++ c gcc autoconf

比如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/

相关文章:

c++ - sscanf 解析方括号内的值

c++ - cstring -> c++ 字符串转换

c - 带有循环迭代器和 omp simd 的私有(private)子句

c - 函数转换和 C 中函数参数列表的内部表示

c - 附加到 __VA_ARGS__

c++ - 在 C++ 中终止函数的最简单方法

c++ - 从 boost::multi_index 获取值

无法使用 TMR4、T4CON 等访问定时器 4 pic32

c - C中客户端和服务器程序之间的时钟同步

c - Null/void 指针不正确的值