使用双下划线时启用编译器警告

时间:2018-11-05 12:58:00

标签: c gcc clang

让我们假设以下代码

int __foo(void) {
    return 0;
}

int _BAR(void) {
    return 3;
}

int main(void) {
    return __foo() & _BAR();
}

双下划线和单个下划线后跟大写字母符号是保留字,因此是不允许的(This is a C++ question, but it also mentions the C rules)。

我在gcc上尝试了-Wall -Wextra -pedantic选项,在clang上尝试了-Weverything选项,但都没有对此发出警告。

有什么方法可以为此启用编译器警告吗?

2 个答案:

答案 0 :(得分:5)

GCC和Clang似乎不提供这种功能。

有关GCC警告消息的文档为here(对于8.2版,要查找其他版本的文档,请启动here)。他们中没有人提到检查保留的标识符或以下划线后跟下划线或大写字母开头的标识符,但某些特殊情况(例如内置__FILE__)对此问题无用。 >

Clang的文档为here(似乎是当前版本的链接,因此希望将来可以更新)。同样,它也没有提到检查保留的标识符。

在Clang中,-Weverything启用了所有诊断,因此,如果在使用-Weverything编译示例代码时没有出现任何诊断,则无法在Clang中实现所需的诊断。

似乎没有任何原因导致编译器无法执行此操作。 Clang确实跟踪源文本的来源。例如,如果宏扩展导致语法错误,则Clang打印多条诊断行,其中显示所涉及宏的名称,行号和文件名。此外,Clang禁止显示系统标题中的警告,并可以告诉它们与#pragma clang system_header类似地处理其他文件(例如库的标题)。因此,对于Clang来说,对于不是源自系统头的任何保留标识符产生警告似乎是可行的。缺少此功能可能是由于需求不足。

答案 1 :(得分:2)

编译器实际上无法警告您。一旦预处理器包含了任何标准库文件(当然可以包含双下划线),编译器就不会真正知道此类代码的来源。

但是,好的IDE或静态分析器可以警告您。