将多个 -std 开关传递给 g++

2023-11-22

假设运行是否安全g++ with

g++ -std=c++98 -std=c++11 ...

会使用C++11编译吗?我在中没有找到明确的确认文档,但我看到-O标志的行为是这样的。


The 海湾合作委员会手册没有说明 任何互斥的最后一个-std=...指定的选项生效。第一次出现 或最后一次出现是唯一的选择。有无数 从有限集中获取互斥替代值的 GCC 标志 - 相互 互斥,至少对翻译单元的语言取模。让我们称呼他们为互斥选项简而言之。 最后设置生效的记录似乎是随机的。这是 记录为-O正如您所指出的,一般而言,对于相互排斥的警告选项,也许 其他的。从来没有记录表明first多个设置生效,因为 这从来都不是真的。

该文档以历史惯例为基础,但一致性并不完美 类 UNIX 操作系统中的命令使用情况。如果命令接受互斥选项 那么最后一次出现的选项生效。如果命令是——不寻常—— 仅在该选项第一次出现时执行操作,那么这将是一个错误 接受后续事件的命令:它应该给出使用错误。

这是习惯和做法。该定制有助于使用以下工具编写脚本: 尊重它,例如脚本可以调用传递某些默认设置的工具 互斥选项,但允许用户通过脚本的参数覆盖该设置, 其值可以简单地附加到默认调用中。

如果没有达到您想要的效果的官方 GCC 文档,您可能会得到 通过尝试查找任何不适合的 GCC 互斥选项来保证 最后发生的情况生效。这是一刺:

我将编译并链接该程序:

main.cpp

#include <cstdio>

#if __cplusplus >= 201103L 
static const char * str = "C++11";
#else
static const char * str = "Not C++11";
#endif

int main() 
{
    printf("%s\n%d\n",str,str); // Format `%d` for `str` mismatch
    return 0;
} 

使用命令行:

g++ -std=c++98 -std=c++11 -m32 -m64 -O0 -O1 -g3 -g0 \
-Wformat -Wno-format -o wrong -o right main.cpp

它要求矛盾的选项对:

  • -std=c++98 -std=c++11:符合C++98。符合C++11。
  • -m32 -m64:生成 32 位代码。生成 64 位代码。
  • -O0 -O1: 根本不优化。优化至级别 1。
  • -g3 -g0:发出最大调试信息。不发出调试信息。
  • -Wformat -Wno-format。完整性检查printf论据。不要对它们进行理智检查。
  • -o wrong -o right。输出程序wrong。输出程序right

它无需诊断即可成功构建:

$ echo "[$(g++ -std=c++98 -std=c++11 -m32 -m64 -O0 -O1 -g3 -g0 \
-Wformat -Wno-format -o wrong -o right main.cpp 2>&1)]"
[]

不输出任何程序wrong:

$ ./wrong
bash: ./wrong: No such file or directory

它确实输出一个程序right:

$ ./right
C++11
-1713064076

这告诉我们它被编译为C++11, not C++98.

垃圾暴露的bug-1713064076没有确诊是因为-Wno-format, not -Wformat,生效了。

它是 64 位而非 32 位可执行文件:

$ file right
right: ELF 64-bit LSB shared object, x86-64 ...

已经优化了-O1, not -O0, 因为:

$ "[$(nm -C right | grep str)]"
[]

显示本地符号str不在符号表中。

并且它不包含调试信息:

echo "[$(readelf --debug-dump right)]"
[]

as per -g0, not -g3.

由于GCC是开源软件,解决疑虑的另一种方式 至少关于 C 程序员可以使用的行为, 是检查相关的源代码,可通过git源代码控制在https://github.com/gcc-mirror/gcc.

您的问题的相关源代码已在文件中gcc/gcc/c-family/c-opts.c, 功能,

/* Handle switch SCODE with argument ARG.  VALUE is true, unless no-
   form of an -f or -W option was given.  Returns false if the switch was
   invalid, true if valid.  Use HANDLERS in recursive handle_option calls.  */
bool
c_common_handle_option (size_t scode, const char *arg, int value,
            int kind, location_t loc,
            const struct cl_option_handlers *handlers);

它本质上是一个简单的选项设置切换梯子,由scode- 哪个 是OPT_std_c__11供选择-std=c++11- 毫无疑问,它 把一个-std无论之前生效的设置是什么,选项设置都会生效。您可以查看除以下以外的分支master (gcc-{5|6|7}-branch)得出同样的结论。

发现依赖于有效性的 GCC 构建系统脚本并不罕见 通过附加新设置来覆盖选项设置。从法律上讲,这 通常指望未记录的行为,但有更好的 俄罗斯加入北约的可能性大于海合会停止采取最后一种设置的可能性 它解析互斥体选项。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将多个 -std 开关传递给 g++ 的相关文章

随机推荐

  • 如何检查辅助服务是否崩溃(Android Pie 现在在设置中显示此信息)?

    我现在发现安卓9了如果辅助功能服务停止工作 则显示信息 对于尝试利用辅助功能 API 的开发人员来说 这始终是一个痛苦 辅助功能看起来已启用 但服务已停止 为了让它恢复工作 需要关闭然后重新打开辅助功能 如果谷歌完全修复了这个问题 我会很高
  • AVRO 中的数据验证

    我是 AVRO 新手 如果这是一个简单的问题 请原谅 我有一个使用 AVRO 模式进行记录调用的用例 假设我有 avro 架构 name abc namepsace xyz type record fields name CustId ty
  • 既然他们停止为 Eclipse 开发 derby 插件,是否可以在 Eclipse 中使用 apache 的 derby ?

    我想使用 apache 中的 Derby 以便在我当前正在开发的桌面应用程序上包含数据库管理 不幸的是 我发现他们已经停止开发这个插件 并且我在网上阅读的所有教程都引用了这个插件 所以我的问题是 如何在 eclipse 上使用最新版本的 D
  • Jenkinsfile 中的故障后块不起作用

    我正在尝试使用并行步骤进行失败后操作 但它永远不会起作用 这是我的 Jenkins 文件 pipeline agent any stages stage test steps withMaven maven maven3 Maven ins
  • 如何在 LLDB 断点条件下使用堆栈内容?

    问题 我遇到过这样一种情况 我们在启动期间进行媒体播放 并且 objc exception throw 在此期间点击了大约 5 次 但总是被捕获 并且它是way媒体播放器对象的南边 我厌倦了 a 必须手动继续 n 次 或 b 必须禁用断点直
  • 将 Textview 添加到 FrameLayout 的确定位置

    我正在尝试添加一个textView to a frameLayout The TextView has wrap content属性 因此它会随着文本的增长而增长 我将其添加到FrameLayout有了这个功能 FrameLayout fi
  • Java中从磁盘备份和恢复sqlite到内存

    我正在尝试将 sqlite 文件读入内存以获得更好的性能 当关闭我的应用程序时 我想将其写回硬盘 我正在使用jdbc 3 7 2 Java 驱动程序 根据文档 我的代码看起来像 this conn DriverManager getConn
  • 如何使用自动布局在 MKAnnotation 中显示多行?

    我正在使用 Mapkit 如何多行输入MK注释视图 每个注释都有标题和副标题 我如何在以下的帮助下显示多行副标题自动布局 我找到了答案 请尝试我的答案 我们只需要编写代码 MKAnnotationView mapView MKMapView
  • Jade:加载外部javascript并调用函数

    我正在学习 Express Node Jade 现在在 Jade 文件中我想包含一个来自公共文件夹的 javascript 文件 仅用于该页面 例如 在 jade 文件中我输入以下内容 script src javascripts test
  • Delphi XE2 FireMonkey 是否支持 Indy 跨平台应用程序?

    看看带有 Firemonkey 的新 Delphi XE2 考虑到它是针对 Windows Mac OSX 和 iOS 进行编译的 VCL 组件在 FireMonkey 应用程序中毫无用处 我的问题是 是否有 将会有 Indy Firemo
  • 如何从 Dart http 调用返回 json / 如何完全使用流?

    这是我的代码 应该返回 json 我从这里改编了这段代码https github com flutter flutter issues 15110 Stream defaultReturn HttpClientResponse httpCl
  • MissingSecret [MissingSecretError]:请在生产中定义一个“秘密”

    根据文档https next auth js org configuration options secret 添加一个NEXTAUTH 秘密作为环境变量 您不必定义此选项 但在 vercel 制作中我仍然得到 2022 03 24T10
  • 访问元组中元素的时间复杂度

    关于哈希 字典 和列表也有类似的问题 这里还有一条很好的信息 http wiki python org moin TimeComplexity 但我没有找到任何关于元组的信息 访问时间为 data structure i 对于链表来说一般是
  • 如何更改指针的默认图像

    我需要使用一些自定义图像更改光标 指针的默认图像 创建一个类并指定光标的悬停值不是一个有效的解决方案 因为我必须将该类添加到所有已创建的元素中 并且您知道吗 这并不完全是最佳的 也无法将该类添加到主体中 因为带有光标的子级 指针会覆盖它 知
  • 清除 Python 的命令行输出 [Eclipse]

    我正在使用 Eclipse 编写 Python 并且我希望能够轻松地清除屏幕 我见过这个问题 并尝试了 除其他建议外 以下解决方案 import os def clear os system cls if os name nt else c
  • vector> 无法使用 MSVC 进行编译

    制作仅移动类型的地图向量似乎在 Windows 上无法正常工作 请参阅此处的代码 https godbolt org z yAHmzh include
  • Golang 的 SQL 包无法进行即席/探索性查询吗?

    根据文档 从 Go 中的数据库中获取数据的唯一方法似乎是使用 Rows Scan 这意味着您必须在编译时知道所有列的计数和类型 我错过了什么吗 您应该如何支持即席查询 或者甚至从表中取出将来可能发生变化的所有列 The sql Rows类型
  • 图像未显示在托管网站中

    感谢您花时间查看此内容 我已尽我所能进行研究 但没有提出任何建议 我看到一个类似的堆栈溢出帖子 关于等待图像完成处理 但我已经等了大约 2 5 小时 图像仍然丢失 我正在将 AngularFire 与 Firebase 一起使用 我正在使用
  • 使用“base”是否是一种不好的做法,即使它可能有利于可读性?

    我知道这是一个主观问题 但我总是对编码风格的最佳实践感到好奇 ReSharper 4 5 在实现类中调用基本方法之前向我发出有关关键字 base 的警告 即 base DoCommonBaseBehaviorThing 虽然我欣赏 越少越好
  • 将多个 -std 开关传递给 g++

    假设运行是否安全g with g std c 98 std c 11 会使用C 11编译吗 我在中没有找到明确的确认文档 但我看到 O标志的行为是这样的 The 海湾合作委员会手册没有说明 任何互斥的最后一个 std 指定的选项生效 第一次