问题描述
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)
。