我有两个头文件,如下所述:
typedef struct can_type {
int x;
float y;
} M_can_type;
Run Code Online (Sandbox Code Playgroud)
typedef struct can_type {
int x;
float y;
} can_type;
Run Code Online (Sandbox Code Playgroud)
我可以在上面给出的不同文件中定义相同类型的两种结构,我想将一个结构传递给另一个结构吗?另外如何将两个不同类型的结构映射到同一类型,以便我可以将一个结构的元素传递给另一个?
是的,这是合法的.确实,这是必要的.它在标准中是明确的,但它是标准中较为粗糙和几乎难以理解的部分之一.
ISO/IEC 9899:2011§6.2.7兼容型和复合型
1如果类型相同,则两种类型具有兼容类型.用于确定两种类型是否兼容的附加规则在6.7.2中描述了类型说明符,在6.7.3中描述了类型限定符,在6.7.6中描述了声明符.55)此外,如果它们的标签和成员满足以下要求,则在单独的翻译单元中声明的两个结构,联合或枚举类型是兼容的:如果使用标签声明一个,则另一个应使用相同的标签声明.如果两者都在其各自的翻译单元内的任何地方完成,则以下附加要求适用:其成员之间应存在一对一的对应关系,以便每对相应的成员被宣布为兼容类型; 如果使用对齐说明符声明该对中的一个成员,则使用等效的对齐说明符声明另一个成员; 如果该对的一个成员使用名称声明,则另一个成员使用相同的名称声明.对于两个结构,相应的成员应按相同的顺序声明.对于两个结构或联合,相应的位域应具有相同的宽度.对于两个枚举,相应的成员应具有相同的值.
55)两种类型不必相同即可兼容.
"此外"部分将讨论您所询问的情况.
请注意,尽管两个标头中有两个不同的typedef名称(M_can_type和can_type),但定义的结构符合要求.请记住,typedef名称仅用于现有其他类型的(所以别名M_can_type是一个别名struct can_type在包括文件file1.h和can_type是一个别名struct can_type的文件,其中包括file2.h).因为每个头定义了结构类型,所以任何给定的源文件只能包含(直接或间接)两个头中的一个.如果你试图同时包含这两种,你就会得到重新定义的结构类型,这是不允许的(即使在C11中,你可以重新定义相同的typedef名称,只要它定义相同的类型,但你仍然不能在单个翻译单元中具有相同范围的结构类型的两个定义.
确保单独翻译单元中的类型兼容的最常用方法是使用单个标头来定义类型并在两个翻译单元中包括该标头.但是,如果你考虑一下,编译器不知道或不关心你是做什么的.重要的是它在预处理后看到的文本标识了相同的类型.
| 归档时间: |
|
| 查看次数: |
82 次 |
| 最近记录: |