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

时间:2016-01-27 10:06:35

标签: c structure typedef

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

FILE1.C

typedef struct
{
    unsigned int unVar;             

} abc;

file2.c中

typedef struct
{
    int var;
} abc;

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

6 个答案:

答案 0 :(得分:16)

  

6.7.2.1结构和联合说明符

     
      
  1. struct-or-union-specifier中struct-declaration-list的存在声明了一个新类型,   在翻译单位内。
  2.   

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

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

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

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

但是,如果在目标链接对象中有多个具有相同名称的符号(只要导出这些符号,可以使用A = rand( 111 ); E1 = abs( (A\eye(size(A) ) * A ) - eye( size(A) ) ); E2 = abs( ( inv(A) * A ) - eye( size(A) ) ); mean(E1(:)) mean(E2(:)) 关键字进行修改),则在链接期间可能会遇到麻烦。 / p>

答案 3 :(得分:1)

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

但是我还是不建议这样做,以避免你和任何其他开发人员混淆,他们必须使用两种同名的开发人员。

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:1)

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

Does C have One Definition Rule like C++?