编译器不符合ANSI C++规范的部分的表现是什么?

来源:百度知道 编辑:UC知道 时间:2024/06/30 23:38:11
看到很多地方有写
什么什么对ANSI C++规范的符合程度为多少多少
那么我想问一下不符合此规范的地方的表现是什么?
是说
原本 不 该通过编译的 通过编译了
还是
原本该通过编译的 没有 通过编译
还是其他?

一般是指“原本该通过编译的 没有 通过编译”

比如最常见的不符合ANSI C++规范的编译器是vc6

这么写
for (int i = 0; i < 100; i++) {
...
}

for (int i = 0; i < 10; i++) {
...
}

编译就不通过
而C99标准是支持这样的定义的。vc6默认的i的生命周期和C99标准不一样,导致编译不通过,认为后一个i是重复定义了

而一般编译器都有“原本 不 该通过编译的 通过编译了”的情况
那是因为某些原因对标准C做了扩展
比如GCC就有很多扩展(语句表达式,可变参数宏,等等)

这些扩展是ANSI C++里面没有的,却在linux内核代码里面扮演重要的角色

编译器的扩展增大了各编译器之间的差异,降低了某些源代码的可移植性

不过现在vc2008做的不错了,比较符合最新的标准C规范

所以建议写代码的时候,如果没有必要,最好遵守标准C规范

网上可以找到ANSI C的yacc语法文件,你可以研究下(不懂yacc的就看bison帮助文档)

-----------------------------------------

以上内容为本人原创,谢谢

ANSI C++ 一般规定的东西是和系统平台不相关的。这样便于移植。
而编译器“不符合”ANSI C++的东西一般也就是和系统,和软硬件相关的东西啦。
举个例子:
char *p="abcd";
strcpy(p,"efgh");
这个在vc下debug方式是通不过编译的,因为给常量赋值了嘛。但在release下就能运行输出efgh。
这个就和编译器相关啦。
但你如果在定义指针p的时候加个const,就符合ANSI C++标准了,在release下肯定也是会通不过编译的。因为AN