是否允许在同一项目中的2个不同c文件中使用具有不同定义的相同名称结构。例如。
FILE1.C
typedef struct
{
unsigned int unVar;
} abc;
file2.c中
typedef struct
{
int var;
} abc;
在两个文件中都使用了abc。当我将这些文件编译为同一项目的一部分时,没有错误,但我想了解这是否正确用法。
答案 0 :(得分:16)
6.7.2.1结构和联合说明符
- struct-or-union-specifier中struct-declaration-list的存在声明了一个新类型, 在翻译单位内。
醇>
类型仅在翻译单元中定义,在这种情况下是.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编译器中发生。 这个问题不仅发生在结构上,还发生在各种变量上。 我对此提出了一个问题,并提供了一些细节和质量答案。