海湾合作委员会 10.2.0,CLang 11.1.0
我有以下一段代码:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
uint8_t hour = p[8];
uint8_t min = p[9];
uint8_t sec = p[10];
uint16_t msec = (p[11] * 4);
#pragma GCC diagnostic pop
CLang(由 YouCompleteMe vim 插件使用)尊重这些编译指示并且在文件处理期间不显示任何警告。我可以通过注释掉这些编译指示来确认这一点 - YCM 诊断会立即在相应的行上显示警告。
但是,GCC 忽略了它们,我在控制台日志中得到以下信息:
packet.c:111:26: warning: unused variable ‘msec’ [-Wunused-variable]
111 | uint16_t msec = (p[11] * 4);
| ^~~~
packet.c:110:25: warning: unused variable ‘sec’ [-Wunused-variable]
110 | uint8_t sec = p[10];
| ^~~
packet.c:109:25: warning: unused variable ‘min’ [-Wunused-variable]
109 | uint8_t min = p[9];
| ^~~
packet.c:108:25: warning: unused variable ‘hour’ [-Wunused-variable]
108 | uint8_t hour = p[8];
| ^~~~
用于构建的标志:
CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt -Wall -pedantic -Werror=format-security" CXXFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt -Wall -pedantic -Werror=format-security" LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now"
这里发生了什么?似乎是 GCC 中的一个错误
附加 1 即使对于这个最简单的程序,情况似乎也是如此:
int main(int argc, char *argv[]) {
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
int x;
#pragma GCC diagnostic pop
return 0;
}
测试:
[23:41 viktor@desolve-desktop /tmp]$ clang -Wall main.c
[23:41 viktor@desolve-desktop /tmp]$ gcc -Wall main.c
main.c: In function ‘main’:
main.c:4:9: warning: unused variable ‘x’ [-Wunused-variable]
4 | int x;
| ^
附加 2 Some similar bug 是为 g++ 描述的,并且仍然打开了大约 9 年!
答案 0 :(得分:0)
似乎与范围界定有关。当我将 push/pop #pragma
s 移到变量块之外时,GCC 表现得很好。例如:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
uint8_t hour = p[8];
uint8_t min = p[9];
uint8_t sec = p[10];
uint16_t msec = (p[11] * 4);
#pragma GCC diagnostic pop
应该改为:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
{
uint8_t hour = p[8];
uint8_t min = p[9];
uint8_t sec = p[10];
uint16_t msec = (p[11] * 4);
}
#pragma GCC diagnostic pop
然后 clang 和 gcc 都可以正常工作