为啥 -ansi 和 -std=c++11 在 g++ 中会发生冲突?

Posted

技术标签:

【中文标题】为啥 -ansi 和 -std=c++11 在 g++ 中会发生冲突?【英文标题】:Why do -ansi and -std=c++11 conflict in g++?为什么 -ansi 和 -std=c++11 在 g++ 中会发生冲突? 【发布时间】:2013-07-05 03:11:48 【问题描述】:

为什么 -ansi 和 -std=c++11 不能一起工作? (根据其他答案,ANSI 恢复为 C++98) 我正在使用 g++-4.8。

这是 C++11 的 ANSI 批准:

http://webstore.ansi.org/RecordDetail.aspx?sku=INCITS%2fISO%2fIEC+14882-2012

这让我很困惑。 谢谢!

【问题讨论】:

因为新标准的批准并没有导致 gcc 标志的含义发生变化。 但是标志明确地以标准命名,不是吗? 是的,至少最初是这样。不过,更改现有标志的含义很棘手——可能(可能会)破坏大量现有的 makefile 等。 【参考方案1】:

RTFM:

-ansi 在 C 模式下,这相当于-std=c89。在C++模式下,相当于-std=c++98

该标志是在标准有多个版本之前添加的,该标志仍​​然具有相同的含义。

为什么还要同时使用两者?如果你想要-std=c++11,那么就使用它,不要添加另一个意味着其他矛盾的标志。

【讨论】:

我真的不想同时使用两者,但是我通过添加一些 C++11 的优点修改了 makefile 中具有 -ansi 标志的代码,起初我只添加了 -std= c++11 到标志,不知道它会被 -ansi 反击。【参考方案2】:

它们只是标志名称。最好避免将任何东西都称为“ANSI”,因为 1. 它们标准化了很多东西,2. 旧标准会定期更新并进行有意义的更改,以及 3. 它们没有特别参与我所知道的任何计算机语言,而是作为某个国际组织的成员参与,例如 C++、ISO。

在告诉编译器您想要哪种标准化语言方言时,请指定其标准化年份,或者它可以做出的唯一假设是您想要第一个(最古老的)标准。初始标准化是唯一一个没有指定年份不会导致歧义的时间点。

说到歧义,根据documentation,-ansi 是唯一一个其含义取决于GCC 调用的语言标志。 gcc -ansi 表示 C89,g++ -ansi 表示 C++03。就我个人而言,比起更聪明,我更喜欢少含糊。

【讨论】:

【参考方案3】:

是的。 C 中的情况与 C++ 中的情况相同:ANSI 已经(几乎自动)采用了 ISO C 标准的每个版本,包括 C11:http://webstore.ansi.org/RecordDetail.aspx?sku=INCITS%2fISO%2fIEC+9899-2012。每个新标准都“取消并替换”了早期的标准,所以正如你所注意到的,官方的 ANSI 标准是 C11 和 C++11,早期的版本不再是有效的法律。 ANSI 标准是当前的 ISO 标准,句号。

因此,如果您想将--ansi 标志读取为指示ANSI 当前采用的标准,则完全没有必要。

相反,在 C 和 C++ 上下文中,术语“ANSI”用于指代该语言的第一个标准化版本,之后添加了后来的功能。这只是一种习俗,与所有习俗一样,不必从字面上理解。这很方便,因为有些人(通常是普通 C 或 C++ 用户)不太了解标准机构的工作,并认为 ANSI 的最后一个 C 标准确实是 1989 年的标准。这些人将依赖 --ansi 标志,而我们其他人则使用正确的年份标记标准。

【讨论】:

以上是关于为啥 -ansi 和 -std=c++11 在 g++ 中会发生冲突?的主要内容,如果未能解决你的问题,请参考以下文章

为啥要为 c 和 c++ 使用 gcc 和 g++ 编译器驱动程序

为啥安装oracle11g的时候总是应用程序错误

oracle 11g r2安装到最后为啥会出现问题,求大神解决!

安装oracle 11g,为啥不需要windows系统安装jre就可以安装?

安装oracle 11g,为啥不需要windows系统安装jre就可以安装?

为啥在 c++ 11 和 c++ 17 中给出代码存在输出差异?