关于默认的C struct值,这段代码怎么样?

我正在尝试使用默认值创建结构。 我不知道如何实现这个目标,因为我看到的每个代码都是关于初始化的,我会以自然的方式来做…

struct stuff { int stuff_a = 1; int stuff_b = 2... ...and so on... }; 

看,我发现这个(C ++)代码:

 struct a{ a() : i(0), j(0) {}; INT i; INT j;} 

我从来没有为C看过这样的事。请帮我理解一下; 我觉得这很好!

更新:等等,我问的是C !!!! 为什么改变我的问题? 如果在C中这是不可能的,那就说……我不懂C ++,我不知道那是关于C ++的……

如果你想一次性设置一个struct对象并且你有一个C99编译器,试试这个:

 struct stuff { int stuff_a; int stuff_b; // and so on... }; struct stuff foo; /* ... code ... */ foo = (struct stuff){.stuff_b = 42, .stuff_a = -1000}; 

否则,使用C89编译器,您必须逐个设置每个成员:

 foo.stuff_b = 42; foo.stuff_a = -1000; 

运行示例@ ideone: http ://ideone.com/1QqCB


原线

 struct a{ a() : i(0), j(0) {} INT i; INT j;} 

是C语法错误

正如您可能从其他答案中学到的, 在C语言中,您无法声明结构并同时初始化它的成员 。 这些是不同的任务,必须单独完成。

初始化结构的成员变量有几个选项。 我将在下面展示几种方式。 现在,让我们假设在文件的开头定义了以下结构:

 struct stuff { int stuff_a; int stuff_b; }; 

然后在main()代码上,假设您要声明一个这种类型的新变量:

 struct stuff custom_var; 

这是您必须初始化结构的时刻。 说真的,我的意思是你真的必须! 即使您不想为它们分配特定值,也必须至少将它们初始化为零。 这是强制性的,因为操作系统不保证它会为您提供一个干净的内存空间来运行您的应用程序。 因此,始终将变量初始化为某个值(通常为0),包括其他默认类型,如char,int,float,double等…

将结构初始化为零的一种方法是通过memset()

 memset(&custom_var, 0, sizeof(struct stuff)); 

另一个是分别访问每个成员:

 custom_var.stuff_a = 0; custom_var.stuff_b = 0; 

第三个选项可能会让初学者感到困惑,因为当他们看到结构成员的初始化在声明时完成:

 struct stuff custom_var = { 1, 2 }; 

上面的代码相当于:

 struct stuff custom_var; custom_var.stuff_a = 1; custom_var.stuff_b = 2; 

…使用默认值创建结构…

这在C中是不可能的。类型不能具有默认值。 任何类型的对象都不能具有0以外的默认值 ,尽管它们可以初始化为任何想要的值。
struct的定义是类型的定义,而不是对象的定义。


你问的是关于将int默认为42的方法。

 /* WRONG CODE -- THIS DOES NOT WORK */ typedef int int42 = 42; int42 a; printf("%d\n", a); /* print 42 */ 

或者,适应你的榜样

 /* WRONG CODE -- THIS DOES NOT WORK */ struct stuff { int42 stuff_a; int65536 stuff_b; } struct stuff a; printf("%d\n", a.stuff_b); /* print 65536 */ 

更新:这个答案假设我们正在谈论C ++,因为答案中发布的代码不合法​​C.

  struct a { a() : i(0), j(0) {} // constructor with initialization list int i; int j; } 

用注释标记的行只是struct a实例的构造struct a (提醒:结构就像类一样,除了默认成员可见性是public而不是private )。

:之后的部分称为初始化列表 :它允许您使用值(常量或作为构造函数参数传递)初始化struct的成员。 此列表中成员的初始化发生在输入构造函数的主体之前。 如果可能的话, 最好以这种方式初始化类和结构的成员。

另请参阅C ++:struct / class中的构造函数与初始化列表 。

在C(前C99)中,以下也有效:

 #include  typedef struct { int a; int b; int c; } HELLO; int main() { HELLO a = {1,2,3}; printf("here: %d %d %d\n",aa,ab,ac); exit(1); } 

请参阅键盘

我不确定你的问题是什么。 在c中初始化结构的标准方法是这样的:

 struct a_struct my_struct = {1, 2}; 

或者更新,更安全:

 struct a_struct my_struct = {.i1 = 1, .i2 = 2}; 

如果结构有多个实例,或者需要重新初始化,则定义具有默认值的常量结构然后分配它是很有用的。

 typedef struct a_struct { int i1; int i2; } sa; static const sa default_sa = {.i1 = 1, .i2 = 2}; static sa sa1 = default_sa; static sa sa2 = default_sa; // obviously you can do it dynamically as well void use_temp_sa(void) { sa temp_sa = default_sa; temp_sa.i2 = 3; do_something_with(&temp_sa); } // And re-initialise void reset_sa(sa *my_sa) { *my_sa = default_sa; } 

在C中无法使用类型初始值设定项。

  • 值必须存储在内存中。
  • 类型不占用内存,占用内存的是该类型的变量。

    struct stuff; 是一种类型; 它不占用记忆

    struct stuff aStuff; 是该类型的变量; aStuff占用内存

  • 由于类型不占用内存, it is not possible to save values into a type

  • 如果存在语法糖以支持将值存储/初始化为类型,则必须插入additional code以将值分配给该类型的每个即时变量(例如: constructor in C++中的constructor in C++ )。 如果此function可用,这将导致效率较低的C。

  • 您需要多久保留一次此默认值? 我认为这不太可能。 您可以创建一个函数来使用默认值初始化变量,或者只使用所需的值初始化每个字段。 所以类型初始化程序不是基本的东西。 C is about simplicity

无法初始化结构定义中的值。

我建议:

 typedef struct { int stuff_a; int stuff_b; } stuff ; int stuffInit(int a, int b, stuff *this){ this->stuff_a = a; this->stuff_b = b; return 0; /*or an error code, or sometimes '*this', per taste.*/ } int main(void){ stuff myStuff; stuffInit(1, 2, &myStuff); /* dynamic is more commonly seen */ stuff *dynamicStuff; dynamicStuff = malloc(sizeof(stuff)); /* 'new' stuff */ stuffInit(0, 0, dynamicStuff); free(dynamicStuff); /* 'delete' stuff */ return 0; } 

在面向对象编程(C ++)之前,我们学习了“抽象数据类型”。

该学科说’永远不会直接访问你的数据结构,总是为它创建一个函数’但这只是由程序员,讲师或高级开发人员强制执行,而不是语言。

最终,结构定义和相应的函数最终在它们自己的文件和标题中,稍后链接,进一步封装设计。

但那些日子已经过去了,取而代之的是“Class”和“Constructor”OOP术语。

“这一切都是一样的,只有名字改变了” – Bon Jovi。