gcc vs clang:-pedantic-errors的含义

时间:2016-08-08 02:13:12

标签: c++ c gcc clang portability

我在Win10上使用了clang v3.7.0和mingw64 5.1.0以及GCC 5.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

但是我最近用clang尝试了它并获得了不同的结果。这是我的示例测试代码:

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,那么clang只会将其标记为警告,这就是我真正想要的。但是,根据GCC文档,-pedantic-errors选项会将被视为语言扩展的警告标记为错误,但不使用函数原型不是C89中的扩展。所以,我有三个基本问题:

  1. clang是否从GCC使用的含义改变了-pedantic-errors的含义,还是我误解了某些内容?

  2. 哪些最佳选项会强制遵守所选标准,并会针对所有不符合规范的代码发出错误?

  3. 如果我继续对clang使用-pedantic-errors有没有办法让它在特定情况下发出警告而不是错误?在本网站的另一篇帖子中,给出了一个答案,说使用以下内容,其中foo是错误:

    -Wno-error=foo
    
  4. 如果这是一个正确的方法,由于没有指出实际的错误编号,我实际上用什么代替foo来表示错误?我无法相信它实际上需要以下所有内容:

    -Wno-error=implicitly declaring library function 'strlen'
    with type 'unsigned long long (const char *)'
    

0 个答案:

没有答案