是否允许在同一项目中的2个不同c文件中使用具有不同定义的相同名称结构。 例如。
FILE1.C
typedef struct { unsigned int unVar; } abc;
file2.c中
typedef struct { int var; } abc;
两个文件中都使用了abc。 当我将这些文件编译为同一项目的一部分时,没有错误,但我想了解这是否正确用法。
6.7.2.1结构和联合说明符
类型仅在翻译单元中定义,在这种情况下是.c文件。
在两个不同的翻译单元中定义两个具有相同名称的类型没有问题。
但是,除非它们遵循6.2.7。,p1中描述的规则,否则这两种类型不兼容。 您定义的类型不兼容 。
这是类型定义。 它是每个.c文件的本地文件,没有理由得到错误。 必须在头文件中进行定义,然后您才会遇到此类问题。
符号名称(变量’,函数)在翻译单元中必须是唯一的。
翻译单元是C和C ++的基本编译单元。 它由源文件和所有包含的文件(直接或间接)组成。
在您的情况下,您有两个独立的源文件,每个文件定义一个结构; 但他们彼此“看不到”,因为他们在不同的翻译单位内。
但是,如果在目标链接对象中有多个具有相同名称的符号(只要导出这些符号,可以使用static
关键字修改),则在链接期间可能会遇到麻烦。
在两个不同的* .c文件中定义两个具有相同名称的结构是正确的用法,因为它们仅对定义它的* .c中的当前作用域有效。
但进一步我不建议这样做,以避免任何混淆你和任何其他开发人员,他们必须使用两种相同的名称做其他事情。
每个定义对于出现的文件都是本地的。 由于您单独编译文件,因此编译器一次只能看到一个文件。 将对象文件绑定在一起的链接器不会validation类型一致性,它只按名称解析符号。
如果要将st_localAscdData
或指向st_localAscdData
的指针st_localAscdData
给来自不同模块的函数,则必须确保在不同模块中声明的类型之间的一致性。 这是头文件的目的。 共享声明属于头文件,必须包含在共享给定类型或function的所有模块中。
全局类型一致性不是由C语言强制执行,也不是C ++在某种程度上强制执行,它是程序员的责任。 编码规则是帮助程序员避免陷入这一缺陷的指导原则。
您期望重新定义的错误(将在cpp编译器中发生)但在C编译器中不会发生。 这个问题不仅发生在结构上,还发生在各种变量上 。 我已经提出了一个问题并且有一些细节和质量的答案。
C有像C ++这样的一个定义规则吗?
以上就是c/c++开发分享在C中具有不同定义的相同名称结构相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/560660.html