aga*_*anm 3 c parameters struct scope function
如何在 C 中调用采用匿名结构的函数?
比如这个函数
void func(struct { int x; } p)
{
printf("%i\n", p.x);
}
Run Code Online (Sandbox Code Playgroud)
当提供原型的函数声明在范围内时,调用该函数的参数必须具有与原型中声明的类型兼容的类型,其中“兼容”具有标准定义的特定含义:
如果两个类型的类型相同,则它们具有兼容类型。用于确定两种类型是否兼容的附加规则[与所讨论的情况无关]。此外,在单独的翻译单元中声明的两个结构体、联合体或枚举类型如果其标记和成员满足以下要求,则它们是兼容的:如果其中一个使用标记进行声明,则另一个应使用相同的标记进行声明。如果两者都在各自翻译单元内的任何位置完成,则适用以下附加要求:其成员之间应存在一一对应关系,以便每对相应成员都声明为兼容类型;[...]并且如果该对中的一个成员使用名称声明,则另一个成员也使用相同的名称声明。对于两个结构体,相应的成员应以相同的顺序声明。[...]
(C11,6.2.7/1)
标准意义上的“相同类型”是一个范围问题,函数的调用者无法满足这一点,因为函数参数列表中结构声明的范围仅限于该函数如果有的话,它出现在定义中,或者如果它只出现在原型中,则单独到参数列表中。
那么,要调用该函数,您必须以某种方式利用类型兼容性的附加规则,这些规则(仅)func()在与调用者不同的翻译单元中定义时才适用。在这种情况下,最简单的事情可能是typdef调用者翻译单元中的兼容类型:
typedef struct { int i; } one_int;
Run Code Online (Sandbox Code Playgroud)
然后,您可以像该 TU 中那样对函数进行原型设计:
void func(one_int p);
Run Code Online (Sandbox Code Playgroud)
您可以使用类型为 的参数来调用它one_int。例如,
one_int oi = { 1 };
func(oi);
Run Code Online (Sandbox Code Playgroud)
但请注意,虽然上述原型与问题中给出的函数定义兼容,只要它们出现在不同的翻译单元中,但两者不能出现在同一翻译单元中,因此您不能遵循通常的建议,即每个 . c 文件#include标头声明其功能。
总的来说,最好将结构声明从原型中提出来,或者借助typedef上面演示的方法,或者给它一个标签,其中任何一个都可以从代码中引用它它的定义。
| 归档时间: |
|
| 查看次数: |
1230 次 |
| 最近记录: |