Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么联盟中的成员名称与C中的typedef名称相同?_C_Typedef - Fatal编程技术网

为什么联盟中的成员名称与C中的typedef名称相同?

为什么联盟中的成员名称与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; 我同意上面的示例,但我仍然

我在下面的“compiler_defs.h”中找到了这一定义,它是用于8位MCU应用程序的SiLabs IDE附带的。我做了一些搜索工作,它似乎与名称空间和标识符可见性问题有关。C中使用了5个名称空间(参考:):

  • 语句标签
  • 结构、联合和枚举标记
  • 组织或工会的成员
  • 普通标识符
  • Typedef名称
  • 例如:

    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?
    

    你回答了自己的问题:

  • 语句标签
  • 结构、联合和枚举标记
  • 组织或工会的成员
  • 普通标识符
  • Typedef名称
  • 这些名称空间是独立的,即一个名称空间中的名称不会与另一个名称空间中的相同名称冲突。就你而言:

    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]