繁体   English   中英

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

[英]How to capture a struct declaration in function

我有以下C代码:

struct {
    short s;
    int n;
} variableName;

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

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

func(&variableName);

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

不,您不能在C函数中传递“匿名”结构。您当然可以定义函数以单独接受参数:

void func(short s, int n) { ... }

或者,您可以在函数和调用代码都可见的地方定义MyStruct结构。 请注意,执行此操作时,整个结构均按值(副本)传递,这可能是您想要的(或可能不是)行为。

您可能正在寻找更多其他语言提供的“字典”或“关联数组”或“哈希”类型的东西,其中包含任意键值对。 纯C没有为此提供便利; 编译器希望事先知道结构的布局。

(我不确定您是否会问一个更深奥的想法,那就是隐藏结构的组成并将“不透明的句柄”传递到API之中或之外。在C语言中有多种结构方法,但是请说出来,如果那是您要说的话。)

完全被忽略“我想在不提供结构定义的情况下执行此操作。有没有办法捕获variableName?” 在OP中,除非它在之后进行了编辑。 现在,这个问题变得不那么有意义了,但是在这里,您通常如何将结构传递给函数以供将来的读者使用。

#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。

此示例代码输出: 参数值为:DEAD BEEF

如果您使用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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM