Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ gcc vs clang:学究式错误的意义_C++_C_Gcc_Clang_Portability - Fatal编程技术网

C++ gcc vs clang:学究式错误的意义

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

我在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-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中的扩展。因此,我有三个基本问题:

  • clang是否改变了GCC使用的迂腐错误的含义,或者我误解了什么

  • 强制遵守所选标准并对所有不合格代码发出错误的最佳选项集是什么

  • 如果我继续在叮当声中使用-pedanticerrors,有没有办法让它在特定情况下发出警告而不是错误?在该网站上的另一篇帖子中,给出了一个答案,表示使用以下内容,其中foo是错误:

    -Wno-error=foo
    
  • 如果这是一个正确的方法,那么对于我得到的错误,我实际使用什么来代替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语言标准”,所有这些都可以避免吗?我只是不明白为什么有些人喜欢吹毛求疵,而不是仅仅看到明显的意图。我也知道旧的“版本”(不是标准)已经过时了,但是程序员可能不得不遵守它们有很多原因。