【问题标题】:Struct initialization of the C/C++ programming language?C/C++编程语言的结构初始化?
【发布时间】:2010-12-14 21:04:18
【问题描述】:

我可以用代码进行结构初始化:

struct struct_type_id struct_name_id = { value1, value2, value3 };

但不能:

struct struct_type_id struct_name_id;
struct_name_id = { value1, value2, value3 };

为什么前者可以,而后者用gcc,g++,vc2008,vc6不行?换句话说,为什么c/c++编程语言不支持这种语法?

谢谢。

【问题讨论】:

  • 在哪里可以了解有关这种 C/C++ 编程语言的更多信息?有网页吗?

标签: c++ c struct


【解决方案1】:

第一条语句创建了一个初始化为给定值的变量,即这些值内置在内存中,并直接存储在该变量地址中的可执行程序中(对于全局变量)或准备好进行内存复制(对于堆栈变量)。

第二块的第二条语句很不一样。虽然看起来很相似,但它是一个赋值表达式。这意味着等于运算符的 RHS 是一个被计算的表达式(独立于 = 的 LHS 中的内容),然后传递给 = 运算符。如果没有适当的上下文,{...} 没有任何意义。

在 C99 中,您可以这样做:

struct_name_id = (struct struct_type_id){ value1, value2, value3 };

现在等号运算符的 RHS 是一个有效的表达式,因为编译器有适当的上下文知道 {...} 中的内容。

在 C++11 中,语法为:

struct_name_id = struct_type_id{ value1, value2, value3 };

【讨论】:

  • @Juliano:C89 也支持符合 gcc 的这种类型转换语法。
  • @jcyang:GCC 可能允许这种语法,但它不是 C89/C90(它是 GCC 扩展)。例如,MSVC、Digital Mars 和 Comeau 不支持该语法(除非您在 Comeau 中打开 C99 支持)。
  • @michael:但我使用了开关 --std=c89
  • @jcyang:试试 -Wall -pedantic --std=c89
【解决方案2】:

我不知道为什么 C 最初不支持某种语法来使用诸如初始化列表之类的东西来“重新初始化”一个结构 - 肯定有很多时候我会发现它很方便。正如Juliano mentioned,C99(和C++0x)已经在一定程度上修复了它,但我经常不得不坚持使用C90。当我想做这样的事情时,我有时会做以下事情:

struct foo const init_foo = { 1, 2, 3};
struct foo myFoo;

// ....

myFoo = init_foo;  // reinitialize myFoo

【讨论】:

    【解决方案3】:

    您只需要像这样转换值:

    struct_name_id = (struct struct_type_id){ value1, value2, value3 };
    

    【讨论】:

      【解决方案4】:

      我遇到了类似的问题,解决方案是我试图在函数外部初始化结构(不使用初始化语法,而是使用 obj.member = VALUE; 表示法)。这是一个相关的问题,所以在这里发帖,希望有同样问题的人在这里登陆。

      【讨论】:

        【解决方案5】:

        这对你有用吗?

        typedef struct name_id {int value1; int value2; int value3;} NAME_ID;
        name_id mynameid = {0,1,2};
        

        【讨论】:

        • @FractalSpace: 它不能工作。它只是为结构 name_id 定义一个别名,但不改变任何其他内容。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-24
        • 1970-01-01
        • 1970-01-01
        • 2012-03-13
        • 1970-01-01
        • 2012-07-16
        相关资源
        最近更新 更多