我们假设以下代码
int __foo(void) {
return 0;
}
int _BAR(void) {
return 3;
}
int main(void) {
return __foo() & _BAR();
}
Run Code Online (Sandbox Code Playgroud)
双下划线和单个下划线后跟一个大写字母符号是保留的,因此不允许(这是一个C++问题,但它也提到了C规则).
我尝试了-Wall -Wextra -pedantic关于gcc的-Weverything选项和关于clang的选项,两者都没有对此发出警告.
有没有办法为此启用编译器警告?
GCC和Clang似乎没有提供这样的功能.
GCC警告消息的文档在这里(对于版本8.2;要查找其他版本的文档,请从此处开始).他们都没有提到检查保留标识符或以下划线后跟下划线或大写字母开头的标识符,除了某些__FILE__对此问题无用的特殊情况(例如内置).
Clang的文档在这里(似乎是当前版本的链接,因此预计将来会更新).它同样没有提到检查保留标识符.
在Clang中,-Weverything启用所有诊断,因此,如果在编译示例代码时未显示-Weverything诊断,则在Clang中不会实现所需的诊断.
编译器似乎没有任何理由不这样做.Clang确实跟踪源文本的来源.例如,如果宏扩展导致语法错误,Clang将打印多个诊断行,显示所涉及的宏的名称,行号和文件名.此外,Clang会抑制系统标题中的警告,并且可以告诉他们处理其他文件(例如库的标题)#pragma clang system_header.因此,Clang似乎可以为任何不是源自系统头的保留标识符生成警告.缺乏这样的功能可能是由于缺乏需求.