为什么在 C 中重新定义结构没有 GCC 警告?

问题描述

main.h
struct tagname {
     int m1;
     int m2;
};

main.c
#include "main.h"

int main(void) {
    
    struct tagname d1;
    d1.m1 = 7;

    struct tagname {
        float s1;
        float s2;
        float s3;
    };

    struct tagname e1;
    e1.s1 = 0;
}

我正在使用 XC16 v1.60(我相信它使用 GCC v4.5.1 作为基础)和 -Wall、-Wextra、-Wshadow 和许多我认为不相关的其他标志,并且我会认为(希望?)编译器会在这里发出警告。我错过了什么? 编辑:抱歉,我已经用所需的额外细节更新了问题。

解决方法

C 允许在新范围内进行新的标识符声明。当你声明一个函数或用 { 开始一个复合语句时,会开始一个新的作用域。迭代和选择语句也开始了新的作用域。在新的作用域内,标识符的新声明通常会隐藏之前的声明。由于这是合法的 C,编译器允许这样做。

在 GCC 4.5.1 中,the documentation for -Wshadow 表示它会警告“每当一个局部变量隐藏另一个局部变量、参数或全局变量时,或者每当一个内置函数被隐藏时。”结构标记不是局部变量或内置函数。

顺便说一句,main的返回类型应该是int,特殊情况除外;使用 int main(void)int main(int argc,char *argv),而不是 void main(void)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...