为什么没有 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)
。
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)
。