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

Why no GCC warning for re-definition of struct in C?

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的return类型应该是int,特殊情况除外;使用 int main(void)int main(int argc, char *argv),而不是 void main(void)