2016-01-27 137 views
13

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

FILE1.C

typedef struct 
{ 
    unsigned int unVar;    

} abc; 

file2.c中

typedef struct 
{ 
    int var; 
} abc; 

ABC在这两个文件中。当我编译这些文件作为同一个项目的一部分没有错误,但我想知道这是否正确的用法。

+0

没有没有重新定义错误。 –

+0

这里是一个类似的问题http://stackoverflow.com/questions/3995940/casting-one-c-structure-into-another。 – niyasc

+5

@anuj如果它们在不同的编译单元中,并且如果你不在它们之间交换数据(投射指针),那么它是安全的。如果这是一个好习惯......那么这是另一回事。 –

回答

15

6.7.2.1结构和联合说明符

  • 一个结构声明列表的在struct-或愈合说明符的存在声明了一个新的类型, 在翻译单位内。
  • 类型仅在本例中的翻译单元,.c文件中定义。

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

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

    +1

    感谢您的帮助 –

    3

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

    1

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

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

    2

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

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

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

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

    +2

    对于在全局范围定义的符号,这是正确的,但可以在本地范围内重新定义符号:变量和结构变量或typedef。 – chqrlie

    1

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

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

    全局类型一致性不是由C语言实现的,也不是C++在某种程度上的扩展,它是程序员的责任。编码规则是帮助程序员避免此缺陷的缺陷的指导方针。

    1

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

    Does C have One Definition Rule like C++?

    相关问题