GCC忽略诊断杂注,而clang不';T

GCC忽略诊断杂注,而clang不';T,gcc,clang,youcompleteme,Gcc,Clang,Youcompleteme,GCC 10.2.0,CLang 11.1.0 我有以下代码: #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-variable"

GCC 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插件使用)尊重这些pragmas,并且在文件处理过程中不显示任何警告。我可以通过注释这些pragmas out来确认,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中的一个bug

添加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
是为g++设计的,至今仍有9年的历史

似乎与范围界定有关。当我将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都可以正常工作