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

为什么在C中没有重新定义结构的GCC警告?,c,gcc,struct,warnings,definition,C,Gcc,Struct,Warnings,Definition,我使用的是XC16 v1.60(我相信它使用GCC v4.5.1作为基础),带有-Wall、-Wextra、-Wshadow和许多其他我认为不相关的标志,我本以为(希望?)编译器会在这里发出警告。我错过了什么? 编辑:抱歉,我已经用所需的额外细节更新了问题。C允许在新范围内声明新的标识符。当您用{声明一个函数或启动一个复合语句时,它会启动一个新的作用域。迭代和选择语句也会启动新的作用域。在新的作用域内,标识符的新声明通常会隐藏以前的声明。由于这是合法的C,编译器允许这样做 在GCC 4.5.1中

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

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

在GCC 4.5.1中,它警告“当一个局部变量遮蔽另一个局部变量、参数或全局变量时,或当一个内置函数被遮蔽时。”结构标记不是局部变量或内置函数


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

C允许在新的作用域中声明新的标识符。使用
{
,它启动一个新的作用域。迭代和选择语句也启动新的作用域。在新的作用域内,标识符的新声明通常隐藏以前的声明。由于这是合法的C,编译器允许这样做

在GCC 4.5.1中,它警告“当一个局部变量遮蔽另一个局部变量、参数或全局变量时,或当一个内置函数被遮蔽时。”结构标记不是局部变量或内置函数


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

给定一个表达式statation,如
d1.m1=7;
可能不会出现在文件范围内,此代码还远远不够完整,无法进行有意义的讨论。请发布一个。无论如何,GCC 4.5.1是古老的。请安装一个更新的版本。如果第一个结构定义在文件范围内,第二个在函数范围内,则没有没问题。如果第二个函数在一个函数内的复合语句中,也没有问题。这两个定义必须在不同的范围内;它们不能在同一个范围内。-如果Wshadow理解了DOC,则只在C++前端实现。@ MarcGlisse:我不从那个地方得到。部分只适用于C++,例如阴影类M。余烬,实际上它表示了部分相反,对阴影结构标记的警告在C++中不起作用,这表明它在C.中给出了表达式,如“代码>d1.M1=7;”可能不出现在文件范围内,此代码远不够完整,有意义地讨论。请发布。安装一个新的版本。如果第一个结构定义在文件范围内,第二个在函数范围内,则没有问题。如果第二个在函数内的复合语句中,也没有问题。这两个定义必须在不同的范围内;它们不能在同一范围内。- Wshadow仅在C++ FR中实现。如果我理解doc.@ MarcGlisse:我不从它那里得到。它的一些部分只应用于C++,例如阴影类成员,它实际上表示了部分相反的,在阴影结构标签上的警告在C++中不起作用,这表明它在C中确实存在。另一方面,警告通常是合法的但可疑的代码,而Wshadow。特别是关于这种情况,但它只是在C++前端实现的。谢谢。这是有意义的。WSUM不太可能捕捉到这一点,因为它看起来像是它设计用来警告的。另一方面,警告通常是合法的但可疑的代码,而Wshadow则是专门针对的。这种情况,但它只在C++前端实现。谢谢。这是有意义的。WSUM不太可能捕捉到这一点,因为它看起来像是它设计用来警告的。
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;
}