C 一行中的结构声明和指针

C 一行中的结构声明和指针,c,pointers,struct,declaration,C,Pointers,Struct,Declaration,我搜索一种初始化结构并在一行中返回此结构指针的方法。(便携方式是最好的,但至少对gcc是这样) 例如,我得到了一个函数: void myfunc(const mystruct_t *ptr); 结构定义: typedef struct mystruct_t{ int field1; const char *field2; }mystruct_t; 我可以做到: const mystruct_t mystruct={.field1=23, .field2="myname" };

我搜索一种初始化结构并在一行中返回此结构指针的方法。(便携方式是最好的,但至少对gcc是这样)

例如,我得到了一个函数:

void myfunc(const mystruct_t *ptr);
结构定义:

typedef struct mystruct_t{
    int field1;
    const char *field2;
}mystruct_t;
我可以做到:

const mystruct_t mystruct={.field1=23, .field2="myname" };
myfunc(&mystruct);
我想有一种方法可以在一行中完成吗

比如:

myfunc(&{.field1=23, .field2="myname" });
您可以使用自C99以来支持的

myfunc(&(mystruct_t){.field1=23, .field2="myname" });
您可以使用自C99以来支持的

myfunc(&(mystruct_t){.field1=23, .field2="myname" });
使用(在
C99
之前的gcc扩展,自
C99
以来该标准就支持它),类似

myfunc(&(mystruct_t){23, "myname"});
应该是可能的。

使用(C99之前的gcc扩展,自
C99
以来,该扩展受标准支持),类似

myfunc(&(mystruct_t){23, "myname"});

应该是.C++中的

可以通过构造函数来实现,但是用C99复合文字是你需要的。

注释:我知道它被标记为C。它只是我想给出的另一个选择。C++中的

< P>可以通过构造函数来完成,但是用C99复合文字是你需要的。

注意:我知道它被标记为C。这只是我想给出的另一种选择。

我认为您使用的点命名初始化语法无论如何都是一个GCC扩展(因为您提到了可移植性)。如果您想将它们放在一行中,只需将它们放在同一行中即可。如果您的意思是要使用相同的“;”,我认为没有办法,因为您需要先声明一个对象,然后才能获得它的地址。@szczurcio:请更新到16年前版本的C标准。自C99以来,指定的初始化器是标准的。我认为您使用的点命名初始化语法无论如何都是一个GCC扩展(因为您提到了可移植性)。如果您希望它们在一行中,只需将它们放在同一行中即可。如果您的意思是要使用相同的“;”,我认为没有办法,因为您需要先声明一个对象,然后才能获得它的地址。@szczurcio:请更新到16年前版本的C标准。自C99以来,指定的初始化器是标准的。自>16年以来,复合文字不再是gcc扩展。它们是C99之后的标准配置。@Olaf是的,但我们不知道OP的环境,是吗?:)5这不是环境问题,而是编译器提供的语言实现问题。像往常一样,如果没有一些古老的编译器,我们必须假设标准C,通常是C11,但由于在这方面没有相关的变化,C99也是可以接受的。如果OP已经使用了gcc,他也可以使用C11(或C99)模式,这可能是比使用扩展更小的“问题”。(它的可移植性也要高得多。)@Olaf我的印象是,编译器(支持)也被视为环境。但是,增加了一条注释以澄清:C标准明确区分了术语“环境”和“实施”。有时将它们分开并不是那么简单(例如,当涉及到
main
的签名时)。但现在我明白了,你指的是开发平台。但无论如何,如果您使用gcc,为什么更喜欢该扩展而不是直接符合标准?请注意,OP已经使用了指定的初始化器,所以他显然已经使用了C99特性。复合文字不再是gcc的扩展,因为>16年了。它们是C99之后的标准配置。@Olaf是的,但我们不知道OP的环境,是吗?:)5这不是环境问题,而是编译器提供的语言实现问题。像往常一样,如果没有一些古老的编译器,我们必须假设标准C,通常是C11,但由于在这方面没有相关的变化,C99也是可以接受的。如果OP已经使用了gcc,他也可以使用C11(或C99)模式,这可能是比使用扩展更小的“问题”。(它的可移植性也要高得多。)@Olaf我的印象是,编译器(支持)也被视为环境。但是,增加了一条注释以澄清:C标准明确区分了术语“环境”和“实施”。有时将它们分开并不是那么简单(例如,当涉及到
main
的签名时)。但现在我明白了,你指的是开发平台。但无论如何,如果您使用gcc,为什么更喜欢该扩展而不是直接符合标准?请注意,OP已经使用了指定的初始化器,所以他显然已经使用了C99功能。简单而明显的解决方案,但我尝试了但没有成功,但我只是再次尝试并确认它有效。非常感谢allWith OP的原创
const mystruct\u t mystruct={.field1=23.field2=“myname”};myfunc(和mystruct)
mystruct
生存期持续到声明它的块关闭。这个复合文字的持续时间是一样的吗?简单而明显的解决方案,但我尝试了但没有成功,但我只是再次尝试并确认它是有效的。非常感谢allWith OP的原创
const mystruct\u t mystruct={.field1=23.field2=“myname”};myfunc(和mystruct)
mystruct
生存期持续到声明它的块关闭。这个复合文字持续时间相同吗?