C++ gcc vs clang:学究式错误的意义
我在Win10上将ClangV3.7.0与MingW645.1.0和GCC5.1.0一起使用,全部为64位。我的目标是使用一组clang和GCC选项,这将使我有最好的机会在许多不同的编译器中检测潜在的C89和C++98语言标准可移植性问题。例如,对于C,我一直在使用以下GCC命令行,并取得了相当好的成功:C++ gcc vs clang:学究式错误的意义,c++,c,gcc,clang,portability,C++,C,Gcc,Clang,Portability,我在Win10上将ClangV3.7.0与MingW645.1.0和GCC5.1.0一起使用,全部为64位。我的目标是使用一组clang和GCC选项,这将使我有最好的机会在许多不同的编译器中检测潜在的C89和C++98语言标准可移植性问题。例如,对于C,我一直在使用以下GCC命令行,并取得了相当好的成功: gcc -c -x c -std=c89 -pedantic-errors -Wall -Wextra -Wno-comment -Wno-parentheses -Wno-format-ze
gcc -c -x c -std=c89 -pedantic-errors -Wall -Wextra -Wno-comment -Wno-parentheses -Wno-format-zero-length test.c
然而,我最近用叮当声尝试了一下,得到了不同的结果。以下是我的示例测试代码:
int main(void)
{
int length = (int)strlen("Hello");
return 0;
}
对于clang,我得到了以下错误,而对于GCC,我得到了相同的基本内容,但它将其标记为警告:
test.c:3:22: error: implicitly declaring library function 'strlen'
with type 'unsigned long long (const char *)'
int length = (int)strlen("Hello");
如果我删除-pedantic errors选项,或者只是将其更改为-pedantic,那么叮当声只会将其标记为警告,这正是我真正想要的。但是,根据GCC文档,-pedantic errors选项会将被视为语言扩展的警告标记为错误,但不使用函数原型不是C89中的扩展。因此,我有三个基本问题:
-Wno-error=foo
-Wno-error=implicitly declaring library function 'strlen'
with type 'unsigned long long (const char *)'
哦,你真的不应该使用C89。它已经过时17年了,与标准C不完全兼容。与C++98类似。C++11已经变得更好了。@Olaf:C标准的早期版本并没有在以后的版本发布时神奇地消失。它们仍然存在,gcc仍然支持它们。注意,当前C++标准仍然在规范文本中引用C99标准,您声称不存在。我相信POSIX也是这样。奥拉夫:请不要粗鲁。奥拉夫:IEEE与C或C++标准无关。两者都由ISO出版。国际标准化组织已声明,本标准以前的版本已过时。在什么意义上,这句话对其他人有约束力?选择使用旧版本语言标准的人可以这样做。此外,还有一些现有的标准,其中一些是由ISO发布的,规范性地依赖于旧版本的C标准。@Olaf在一个旨在帮助他人解决问题的网站上,似乎一个相当简单的问题变成了一篇关于语义学的论文,这对我来说真的很奇怪。如果我简单地说“C89和C++98语言版本”而不是“C89和C++98语言标准”,所有这些都可以避免吗?我只是不明白为什么有些人喜欢吹毛求疵,而不是仅仅看到明显的意图。我也知道旧的“版本”(不是标准)已经过时了,但是程序员可能不得不遵守它们有很多原因。哦,你真的不应该使用C89。它已经过时17年了,与标准C不完全兼容。与C++98类似。C++11已经变得更好了。@Olaf:C标准的早期版本并没有在以后的版本发布时神奇地消失。它们仍然存在,gcc仍然支持它们。注意,当前C++标准仍然在规范文本中引用C99标准,您声称不存在。我相信POSIX也是这样。奥拉夫:请不要粗鲁。奥拉夫:IEEE与C或C++标准无关。两者都由ISO出版。国际标准化组织已声明,本标准以前的版本已过时。在什么意义上,这句话对其他人有约束力?选择使用旧版本语言标准的人可以这样做。此外,还有一些现有的标准,其中一些是由ISO发布的,规范性地依赖于旧版本的C标准。@Olaf在一个旨在帮助他人解决问题的网站上,似乎一个相当简单的问题变成了一篇关于语义学的论文,这对我来说真的很奇怪。如果我简单地说“C89和C++98语言版本”而不是“C89和C++98语言标准”,所有这些都可以避免吗?我只是不明白为什么有些人喜欢吹毛求疵,而不是仅仅看到明显的意图。我也知道旧的“版本”(不是标准)已经过时了,但是程序员可能不得不遵守它们有很多原因。