【问题标题】:Struct declaration and pointer in one line一行中的结构声明和指针
【发布时间】:2016-01-26 16:40:19
【问题描述】:

我正在寻找一种方法来初始化一个结构并在一行中返回这个结构指针。 (便携方式是最好的,但至少对于 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" });

【问题讨论】:

  • 我认为您使用的点命名初始化语法无论如何都是 GCC 扩展(因为您提到了可移植性)。
  • 如果你希望它们在一行中,只需将它们放在同一行中即可。如果你的意思是你想使用相同的“;”,我相信没有办法,因为你需要在获取它的地址之前声明一个对象。
  • @szczurcio:请更新到 16 年前的 C 标准版本。自 C99 以来,指定的初始化程序是标准的。

标签: c pointers struct declaration


【解决方案1】:

您可以使用自 C99 起受支持的 compound literal

myfunc(&(mystruct_t){.field1=23, .field2="myname" });

【讨论】:

  • 简单而明显的解决方案,但我尝试过但没有成功,但我只是再次尝试并确认它有效。非常感谢大家
  • 使用 OP 的原始 const mystruct_t mystruct={.field1=23, .field2="myname" }; myfunc(&mystruct);mystruct 生命周期持续到它声明的块关闭。这个复合字面量是否相同?
【解决方案2】:

使用compound literalC99 之前的 gcc 扩展,自 C99 起受标准支持),类似于

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

应该可以。

【讨论】:

  • 复合字面量自 >16 年以来不再是 gcc 扩展。它们是自 C99 以来的标准。
  • @Olaf 对,但我们不知道 OP 的环境,对吗? :)
  • 5这不是环境的问题,而是编译器提供的语言实现。与往常一样,如果没有一些古老的编译器,我们必须假设标准 C,通常是 C11,但由于这方面没有相关的变化,C99 也是可以接受的。如果 OP 已经使用 gcc,他也可以使用 C11(或 C99)模式,这可能是比使用扩展更小的“问题”。 (它也更便携。)
  • @Olaf 我的印象是编译器(支持)也被视为环境。但是,添加了一个注释以澄清。 :)
  • C 标准清楚地区分了术语“环境”和“实现”。有时将它们分开并不那么简单(例如,当涉及到main 的签名时)。但现在我明白你的意思是开发平台。但是无论如何,如果您仍然使用 gcc,为什么更喜欢该扩展而不是直接符合标准?请注意,OP 已经使用了指定初始化程序,因此他显然已经使用了 C99 功能。
【解决方案3】:

在 C++ 中,您可以通过构造函数执行此操作,但您需要的是 C99 复合文字。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多