C++11:MinGW当指定-std=c++11选项时 默认定义了__STRICT_ANSI__

__STRICT_ANSI__的来历

__STRICT_ANSI__是gcc编译器的的一个预定义宏,一般来说当使用了-ansi编译选项,就会定义这个宏。
关于__STRICT_ANSI__的来历,参见下面关于gcc编译选项的说明:

-ansi
支持符合ANSI标准的C程序.
这样就会关闭GNU C中某些不兼容ANSI C的特性,例如asm, inline和 typeof关键字,以及诸如unix和vax这些表明当前系统类型的预定义宏.同时开启 不受欢迎和极少使用的ANSI trigraph特性,以及禁止$成为标识符的一部分.
尽管使用了-ansi选项,下面这些可选的关键字, __asm__, __extension__, __inline____typeof__仍然有效.你当然不会把 他们用在ANSI C程序中,但可以把他们放在头文件里,因为编译包含这些头文件的程序时,可能会指定 -ansi选项.另外一些预定义宏,如__unix____vax__,无论有没有使用 -ansi选项,始终有效.
使用-ansi选项不会自动拒绝编译非ANSI程序,除非增加-pedantic选项作为 -ansi选项的补充.
使用-ansi选项的时候,预处理器会预定义一个__STRICT_ANSI__宏.有些头文件关注此宏,以避免声明某些函数,或者避免定义某些宏,这些函数和宏不被ANSI标准调用;这样就不会干扰在其他地方 使用这些名字的程序了.
摘自:http://www.cnblogs.com/liangxiaxu/articles/2617367.html
英文原文参见这里:https://gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/C-Dialect-Options.html#C-Dialect-Options

按照上面这些说明,我们可以理解为,编译器定义是否__STRICT_ANSI__取决于我们在编译代码时,是否使用了-ansi选项。如果没有指定-ansi,就不会有__STRICT_ANSI__

-std=c++11下的变化

但是到gcc全面支持C++11以后,这个逻辑好像就不对了。
下面是一段测试代码。

#include <iostream>
using namespace std;
#ifdef __STRICT_ANSI__
string ansi_status="__STRICT_ANSI__ defined";
#else
string ansi_status="__STRICT_ANSI__ undefined";
#endif
int main() {
	cout << ansi_status << endl; 
	return 0;
}

在MinGW下,不指定-std=c++11时,编译

16:15:37 **** Incremental Build of configuration Debug for project strict_ansi_test ****
Info: Internal Builder is used for build
g++ -O0 -g3 -Wall -c -fmessage-length=0 -o “src\strict_ansi_test.o” “…\src\strict_ansi_test.cpp”
g++ -o strict_ansi_test.exe “src\strict_ansi_test.o”
16:15:39 Build Finished (took 1s.954ms)

运行结果为:

__STRICT_ANSI__ undefined

指定-std=c++11时,编译
这里写图片描述

16:19:52 **** Incremental Build of configuration Debug for project strict_ansi_test ****
Info: Internal Builder is used for build
g++ -std=c++0x -O0 -g3 -Wall -c -fmessage-length=0 -o "src\\strict_ansi_test.o" "..\\src\\strict_ansi_test.cpp" 
g++ -o strict_ansi_test.exe "src\\strict_ansi_test.o" 
16:19:53 Build Finished (took 1s.433ms)

运行结果为:

__STRICT_ANSI__ defined

总结

以上测试总结下来,就是当指定MingW支持C++11时,不论编译是否使用-ansi选项,默认就定义了__STRICT_ANSI__
这是有意为之还是一个bug现在不能确定,但这个变化是需要注意。
linux平台下的gcc是否也是这样,还没有测试。

如果要在-std=c++11选项时不允许编译器预定义__STRICT_ANSI__,就在编译选项中指定 -U__STRICT_ANSI__
这里写图片描述

16:32:13 **** Incremental Build of configuration Debug for project strict_ansi_test ****
Info: Internal Builder is used for build
g++ -std=c++0x -U__STRICT_ANSI__ -O0 -g3 -Wall -c -fmessage-length=0 -o “src\strict_ansi_test.o” “…\src\strict_ansi_test.cpp”
g++ -o strict_ansi_test.exe “src\strict_ansi_test.o”
16:32:14 Build Finished (took 1s.240ms)

运行结果

__STRICT_ANSI__ undefined

本文使用的MinGW编译器版本为5.2.0
参考:http://stackoverflow.com/questions/5580921/how-can-i-make-c0x-and-strict-ansi-get-along

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: "Error" 是一个英文词汇,意为“错误”或“出错”。在计算机科学领域中,当程序不能成功执行任务就会发生错误。 在软件开发中,无论是程序员还是测试人员,都会面临各种类型的错误。其中一些错误可能是语法错误,因为程序员犯了一些编码错误,导致程序无法编译或运行。而另一些错误则可能是由于硬件或软件环境的问题而导致的,如网络连接问题、外部设备故障等等。 无论错误的原因是什么,它都是非常重要的。在程序执行中,任何一个小错误都可能导致程序崩溃或无法按照预期工作。因此,在开发过程中及使用调试工具来查找和修复错误是非常重要的。 在实际使用计算机和软件,可能会遇到各种类型的错误。例如,输入错误的用户名或密码、无法访问网站等等。当这些问题发生,计算机通常会显示相应的错误消息,以帮助用户识别和解决问题。 总之,“Error” 是一个非常重要的词汇,在计算机科学和软件开发中非常常见,它提示我们需要调查和解决问题,以确保计算机和软件能够正常运行。 ### 回答2: 错误:是指在计算机程序或操作中出现的不符合预期或未经验证的行为。在计算机编程中,出现错误可能会导致程序崩溃、数据丢失、系统错误等问题。例如,在编写一个程序,程序员可能会因为语法错误、变量拼写错误、算术错误或逻辑错误而导致错误。此外,硬件故障、网络问题、不兼容的软件、安装错误以及恶意软件等情况也可能导致错误。在调试程序,程序员通常会利用错误信息确定错误,然后尝试改正它。当然,有一些错误可能比较严重,需要更多的间和努力来纠正。因此,在编写任何计算机程序,始终需要遵循最佳实践,以尽可能地减少错误的数量。 ### 回答3: Error是指计算机程序或系统发生的错误或异常情况。当程序中出现错误,计算机会自动产生一系列错误代码,用来描述错误细节。错误代码通常包含在错误信息中,以便开发者或用户更快地定位错误并进行修复。 错误通常分为逻辑错误和运行错误。逻辑错误主要是因为程序设计不合理造成的,例如代码逻辑出错、算法错误等。这类错误通常比较难找到,需要通过代码反复检查才能找出。而运行错误则是指在程序运行过程中出现的错误,例如空指针引用、数组越界等。这种错误通常比较容易发现,由于程序无法继续执行,在终端或日志中会直接显示错误信息。 为了避免错误的出现,我们应该在编写代码认真思考、分析问题,严格遵守编码规范和标准,及测试和调试程序。当程序出现错误,我们应该尽早地对其进行修复,找到并消除错误的根源,以确保程序的正常运行。同,在处理程序错误,我们应该注意保护用户数据的安全,防止数据丢失或泄漏等问题的发生。 总之,错误是计算机程序或系统中不可避免的问题,我们应该采取积极有效的措施来预防和处理错误,提高程序的质量和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值