如何在函数中捕获结构声明

时间:2019-01-17 22:29:27

标签: c struct

我有以下C代码:

struct {
    short s;
    int n;
} variableName;

我想像这样编写一个函数来捕获此变量

void func(MyStruct* var){
    //do stuff
}

func(&variableName);

我想这样做而不提供结构的定义。有没有办法捕获variableName?

3 个答案:

答案 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)

这有很多缺点。最明显的是:

  • 这不是标准的,它使您与clang / gcc绑定
  • 这真是丑陋
  • 它可能仍未达到您的预期

例如,结构上等价的匿名类型具有相同的类型,因此类似这样:

struct foo {
    struct {
        int i;
    } anon1;
    struct {
        int i;
    } anon2;
} foo;

anon1anon2都具有不同的类型,这意味着typeof中的一个不能用来同时引用两者。

从长远来看,几乎可以肯定,您应该为结构命名,尤其是将它们用作函数参数时。例如,如果您想使标头中的变量可用,我认为您将必须努力使其保持匿名。

尽管它不是特别漂亮并且与C ++不兼容,但是C将嵌套声明的名称放在全局名称空间中,因此它是可移植的,并且对前载的代码更改不是很大:

struct {
    struct not_anon {
        int i;
    } anon;
} foo;

void do_something(struct not_anon* member) {
    member->i = 1;
}