我有以下C代码:
struct {
short s;
int n;
} variableName;
我想像这样编写一个函数来捕获此变量
void func(MyStruct* var){
//do stuff
}
func(&variableName);
我想这样做而不提供结构的定义。有没有办法捕获variableName?
答案 0 :(得分:2)
不,您不能将“匿名”结构传递给C语言中的函数。您当然可以定义函数以单独接受参数:
void func(short s, int n) { ... }
或者您可以在函数和调用代码都可见的位置定义MyStruct
结构。请注意,执行此操作时,整个结构均按值(副本)传递,这可能是您在此处想要的行为(或可能不是)。
您可能正在寻找其他语言提供的带有更多键值对的类似“字典”或“关联数组”或“哈希”类型的东西。纯C没有为此提供便利;编译器希望事先知道结构的布局。
(我不确定您是否会问一个更深奥的想法,那就是隐藏结构的组成并将“不透明的句柄”传递到API之中或之外。有多种方法可以构造该结构用C语言编写,但是请说出这是否是您正在谈论的内容。)
答案 1 :(得分:2)
完全忽略了“我想在不提供结构定义的情况下执行此操作。有没有办法捕获变量名?” ,除非对其进行了编辑。这个问题现在意义不大了,但是这里是您通常如何将结构传递给函数以供将来的读者使用。
#include <stdio.h>
struct StructName{
short s;
int n;
};
void func(struct StructName struct_var){
printf("Param values are: %4X %4X\n", struct_var.s & 0xFFFF, struct_var.n & 0xFFFF);
}
int main(){
struct StructName struct_var;
struct_var.s = 0xDEAD;
struct_var.n = 0xBEEF;
func(struct_var);
}
//似乎您正在尝试将定义用作变量。这里的定义是StructName,变量是struct_var。
此示例代码输出: Param值是:DEAD BEEF
答案 2 :(得分:0)
如果您使用clang或gcc,则可以使用typeof
:
struct foo {
struct {
int i;
} anon;
} foo;
void do_something(typeof(foo.anon)* member) {
member->i = 1;
}
如果没有您类型的全局实例,则可以使用typeof((struct foo){}.anon)
。
这有很多缺点。最明显的是:
例如,结构上等价的匿名类型不具有相同的类型,因此类似这样:
struct foo {
struct {
int i;
} anon1;
struct {
int i;
} anon2;
} foo;
anon1
和anon2
都具有不同的类型,这意味着typeof
中的一个不能用来同时引用两者。
从长远来看,几乎可以肯定,您应该为结构命名,尤其是将它们用作函数参数时。例如,如果您想使标头中的变量可用,我认为您将必须努力使其保持匿名。
尽管它不是特别漂亮并且与C ++不兼容,但是C将嵌套声明的名称放在全局名称空间中,因此它是可移植的,并且对前载的代码更改不是很大:
struct {
struct not_anon {
int i;
} anon;
} foo;
void do_something(struct not_anon* member) {
member->i = 1;
}