【问题标题】:How to return a compound literal struct如何返回复合文字结构
【发布时间】:2011-10-18 17:52:19
【问题描述】:

我有一个函数,它总是返回一个具有已知值的结构。语法是什么?

struct MyStruct Function(void)
{
    return (struct MyStruct){1,2,3};
}

返回行出现编译器错误:
错误:语法错误

有什么想法吗?我正在对嵌入式目标使用交叉编译器,所以它可能是我的编译器。


编辑
这是我的编译器。正如 cnicutar 评论的那样,它是有效的 C99 代码。

有人指出我可以创建一个变量。我的目标是避免创建一个变量只是为了返回它。

【问题讨论】:

  • 这是编译器。 C99 完美支持这一点。
  • C++ 怎么样? (GCC C++?有开关吗?)
  • @imacake 问题是关于 C 的,但我想 G++ 默认支持它?

标签: c struct


【解决方案1】:

看起来您正在尝试将初始化程序转换为结构 :-)

这不是有效的语法。尝试类似:

struct MyStruct Function(void)
{
    struct MyStruct s = {1,2,3};
    return s;
}

但最好显示 MyStruct 的确切声明方式,以防万一。

【讨论】:

  • 不,OP 没有投射任何东西,而是返回一个复合文字。但这是 C99 的一项功能,显然并不普遍。
  • @cnicutar 我只是在开玩笑。我怎样才能在我的文字上加一条线?我想删除我所说的语法无效的部分。 C99 欺骗了我。
  • 谢谢@cnicutar。罢工,就是标签。我怀疑我永远不会了解 C99。这些奇怪的事实,比如参数中的char arr[*],或者这个……也许我们应该创建一个社区维基帖子来重新统一这些。
  • @cnicutar 根据我的经验,宣传支持 C99 的编译器支持复合文字。我怀疑问题在于 OPs 编译器仅支持 C89(或其某些方言),因为许多针对嵌入式设备的编译器都想做。
【解决方案2】:

显而易见的方法是创建一个适当类型的变量:

struct MyStruct Function(void) { 
    struct MyStruct ret = {1,2,3};
    return ret;
}

【讨论】:

    【解决方案3】:

    另一种方法是创建一个结构构造函数,例如:

    struct MyStruct newMyStruct(int arg1, int arg2, int arg3) {
        struct myStruct;
        myStruct.a = arg1;
        // ...
        return myStruct;
    }
    

    现在,在函数中你可以返回newMyStruct(1, 2, 3),一行代码

    【讨论】:

      猜你喜欢
      • 2021-03-22
      • 2021-09-09
      • 2014-04-22
      • 1970-01-01
      • 1970-01-01
      • 2019-03-17
      • 1970-01-01
      • 1970-01-01
      • 2021-06-21
      相关资源
      最近更新 更多