为什么联盟中的成员名称与C中的typedef名称相同?
我在下面的“compiler_defs.h”中找到了这一定义,它是用于8位MCU应用程序的SiLabs IDE附带的。我做了一些搜索工作,它似乎与名称空间和标识符可见性问题有关。C中使用了5个名称空间(参考:):为什么联盟中的成员名称与C中的typedef名称相同?,c,typedef,C,Typedef,我在下面的“compiler_defs.h”中找到了这一定义,它是用于8位MCU应用程序的SiLabs IDE附带的。我做了一些搜索工作,它似乎与名称空间和标识符可见性问题有关。C中使用了5个名称空间(参考:): 语句标签 结构、联合和枚举标记 组织或工会的成员 普通标识符 Typedef名称 例如: struct student { char student[20]; int class; int id; } student; 我同意上面的示例,但我仍然
struct student {
char student[20];
int class;
int id;
} student;
我同意上面的示例,但我仍然对下面的代码感到困惑,因此为什么typedef名称与联合定义中的成员名称相同?你能解释一下吗?谢谢
“compiler_defs.h”的代码摘录:
创建我自己的main.c并包含编译器_defs.h:
U16 U16; // this line in main.c cause compiler error: redefinition in VS2015, WHY?
你回答了自己的问题:
U16 U16; // [typedef name] [member variable name]
第一个
U16
位于列表中的名称空间#5中。第二个是命名空间#3。分开的名称空间,因此名称可以相同而没有冲突。您能解释为什么第3点和第5点是不同的名称空间,但这两点不能回答您的问题吗?我回答了您原来的问题,然后您的编辑更改了您的问题。如果你有新问题,问一个新问题。在任何情况下,都不可能告诉您为什么在VS中看到“重新定义”错误,而不仅仅是该行(例如,实际错误消息、错误标识的行、前一行出现语法错误时声明周围的行、任何相关的其他代码等)我会问Silbas为什么他们的库这么奇怪,为什么它不使用标准的C类型(来自stdint.h
)。当我问他们为什么仍然使用8051时,我怀疑你会得到与我相同的回答:“这个垃圾根本不是垃圾,它实际上很棒!因为-原因。”注:请在编写代码时尽量避免这种情况。这会导致测试和维护工程师吃药、吞下格洛克手套或从高楼上跳下来:)对不起,我没说清楚。如果“U16 U16;//[typedef name][member variable name]”在联合定义中有效,为什么在main.c中定义为全局变量的“U16 U16;”无效?我检查了C99,似乎只存在4个名称空间,typedef名称与#4个普通标识符共享相同的名称空间。但如果将此“U16 U16;//[typedef name][member variable name]”作为全局变量定义放在文件范围中,编译器将报告错误。
U16 U16; // [typedef name] [member variable name]