是否可以从 gcc 的源代码中确定或设置编译器选项?

Posted

技术标签:

【中文标题】是否可以从 gcc 的源代码中确定或设置编译器选项?【英文标题】:Is it possible to determine or set compiler options from within the source code in gcc? 【发布时间】:2014-09-03 16:25:39 【问题描述】:

我有一些代码需要某个 gcc 编译器选项(否则它不会编译)。当然,我可以确保在 makefile 中为这个特定的源文件设置了所需的选项。但是,如果可以在 source_file.cpp 中为相应的编译单元(或其中的一部分)设置此选项,则会更有帮助。

我知道可以使用#pragma GCC diagnostic 打开或关闭警告消息,但是-fsomething 类型的选项呢?我从this question 那里得知这是不可能的。

但也许至少有一种方法可以从代码中检查某个 -f 选项是否打开?

注意我对从二进制文件as was asked previously 或命令行中查找编译器标志不感兴趣。

【问题讨论】:

您对哪个选项感兴趣? @OregonTrail -fext-numeric-literals,当使用 GNU 扩展 __float128std=c++11(而不是 std=gnu++11)时需要。 【参考方案1】:

根据我的经验,不会。这不是你做这件事的方式。相反,您将编译器/平台/操作系统特定的代码放在源代码中,并用适当的ifdef 语句包装它。其中包括:

#ifdef __GNUC__
/*code for GNU C compiler */
#elif _MSC_VER
/*usually has the version number in _MSC_VER*/
/*code specific to MSVC compiler*/
#elif __BORLANDC__
/*code specific to borland compilers*/
#elif __MINGW32__
/*code specific to mingw compilers*/
#endif

在此,您可以有特定于版本的要求和代码:

#ifdef __GNUC__
#  include <features.h>
#  if __GNUC_PREREQ(4,0)
//      If  gcc_version >= 4.0
#  elif __GNUC_PREREQ(3,2)
//       If gcc_version >= 3.2
#  else
//       Else
#  endif
#else
//    If not gcc
#endif

从那里,您的 makefile 会根据编译器类型、版本等传递适当的编译器标志,然后一切就绪。

【讨论】:

是的,我知道,但这很乏味。【参考方案2】:

您可以尝试使用一些#pragma。见GCC diagnostic pragmas & GCC function specific pragmas。

否则,开发您的 GCC 插件或您的 MELT 扩展并让它提供一个编译指示,在 GCC 中设置适当的变量或编译器状态(实际上是 cc1plus

【讨论】:

我查看了#pragma 选项(在询问之前已经),但找不到任何有用的东西。 开发你的 GCC 插件或你的 MELT 扩展我宁愿避免那个 hack。但感谢您指出这种可能性。

以上是关于是否可以从 gcc 的源代码中确定或设置编译器选项?的主要内容,如果未能解决你的问题,请参考以下文章

交叉编译:特殊的交叉编译器或只是带有选项 -march 的 gcc?

是否有 GCC 编译器/链接器选项来更改 main 的名称? [复制]

gcc 编译控制选项

gcc 优化

gcc编译选项-Wall(编译警告:未使用变量变量未初始化类型转换等)

Xlc '-qthreaded' 编译器选项的 gcc 等效项是啥?