我在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中的扩展。所以,我有三个基本问题:
clang是否从GCC使用的含义改变了-pedantic-errors的含义,还是我误解了某些内容?
哪些最佳选项会强制遵守所选标准,并会针对所有不符合规范的代码发出错误?
如果我继续对clang使用-pedantic-errors有没有办法让它在特定情况下发出警告而不是错误?在本网站的另一篇帖子中,给出了一个答案,说使用以下内容,其中foo是错误:
-Wno-error=foo
如果这是一个正确的方法,由于没有指出实际的错误编号,我实际上用什么代替foo来表示错误?我无法相信它实际上需要以下所有内容:
-Wno-error=implicitly declaring library function 'strlen'
with type 'unsigned long long (const char *)'