在C中具有不同定义的相同名称结构

是否允许在同一项目中的2个不同c文件中使用具有不同定义的相同名称结构。 例如。

FILE1.C

typedef struct { unsigned int unVar; } abc; 

file2.c中

 typedef struct { int var; } abc; 

两个文件中都使用了abc。 当我将这些文件编译为同一项目的一部分时,没有错误,但我想了解这是否正确用法。

6.7.2.1结构和联合说明符

  1. struct-or-union-specifier中struct-declaration-list的存在在转换单元中声明了一个新类型。

类型仅在翻译单元中定义,在这种情况下是.c文件。

在两个不同的翻译单元中定义两个具有相同名称的类型没有问题。

但是,除非它们遵循6.2.7。,p1中描述的规则,否则这两种类型不兼容。 您定义的类型不兼容

这是类型定义。 它是每个.c文件的本地文件,没有理由得到错误。 必须在头文件中进行定义,然后您才会遇到此类问题。

符号名称(变量’,函数)在翻译单元中必须是唯一的。

翻译单元是CC ++的基本编译单元。 它由源文件和所有包含的文件(直接或间接)组成。

在您的情况下,您有两个独立的源文件,每个文件定义一个结构; 但他们彼此“看不到”,因为他们在不同的翻译单位内。

但是,如果在目标链接对象中有多个具有相同名称的符号(只要导出这些符号,可以使用static关键字修改),则在链接期间可能会遇到麻烦。

在两个不同的* .c文件中定义两个具有相同名称的结构是正确的用法,因为它们仅对定义它的* .c中的当前作用域有效。

但进一步我不建议这样做,以避免任何混淆你和任何其他开发人员,他们必须使用两种相同的名称做其他事情。

每个定义对于出现的文件都是本地的。 由于您单独编译文件,因此编译器一次只能看到一个文件。 将对象文件绑定在一起的链接器不会validation类型一致性,它只按名称解析符号。

如果要将st_localAscdData或指向st_localAscdData的指针st_localAscdData给来自不同模块的函数,则必须确保在不同模块中声明的类型之间的一致性。 这是头文件的目的。 共享声明属于头文件,必须包含在共享给定类型或function的所有模块中。

全局类型一致性不是由C语言强制执行,也不是C ++在某种程度上强制执行,它是程序员的责任。 编码规则是帮助程序员避免陷入这一缺陷的指导原则。

您期望重新定义的错误(将在cpp编译器中发生)但在C编译器中不会发生。 这个问题不仅发生在结构上,还发生在各种变量上 。 我已经提出了一个问题并且有一些细节和质量的答案。

C有像C ++这样的一个定义规则吗?