为什么 -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
这让我很困惑。谢谢!
为什么 -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
这让我很困惑。谢谢!
实时调频:
-ansi
在 C 模式下,这相当于-std=c89
. 在 C++ 模式下,它相当于-std=c++98
.
该标志是在标准有多个版本之前添加的,该标志仍然具有相同的含义。
你为什么要同时使用两者?如果您想-std=c++11
使用它,请不要添加另一个表示其他矛盾的标志。
它们只是标志名称。最好避免将任何东西都称为“ANSI”,因为 1. 它们标准化了很多东西,2. 旧标准会定期更新并进行有意义的更改,以及 3. 它们没有特别参与我所知道的任何计算机语言,而是作为某个国际组织的成员参与,例如 C++、ISO。
在告诉编译器您想要哪种标准化语言方言时,请指定其标准化年份,或者它可以做出的唯一假设是您想要第一个(最古老的)标准。最初的标准化是唯一一个没有指定年份不会导致歧义的时间点。
说到歧义,根据文档,-ansi
它是唯一的语言标志,其含义取决于 GCC 的调用。gcc -ansi
表示 C89,g++ -ansi
表示 C++03。就我个人而言,我更喜欢更少的歧义而不是更多的聪明。
是的。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
标志,而我们其他人使用正确的年份标签标准。