如何解决为什么在 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)
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。