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

dri*_*ker 9 c struct

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

struct stuff {
  int stuff_a = 1;
  int stuff_b = 2...
  ...and so on...
};
Run Code Online (Sandbox Code Playgroud)

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

struct a{   a() : i(0), j(0) {};  INT i;   INT j;}
Run Code Online (Sandbox Code Playgroud)

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

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

pmg*_*pmg 15

如果你想一次性设置一个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};
Run Code Online (Sandbox Code Playgroud)

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

foo.stuff_b = 42;
foo.stuff_a = -1000;
Run Code Online (Sandbox Code Playgroud)

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


原线

struct a{   a() : i(0), j(0) {}   INT i;   INT j;}
Run Code Online (Sandbox Code Playgroud)

是C中的语法错误


kar*_*lip 10

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

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

struct stuff {
  int stuff_a;
  int stuff_b;
};
Run Code Online (Sandbox Code Playgroud)

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

struct stuff custom_var;
Run Code Online (Sandbox Code Playgroud)

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

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

memset(&custom_var, 0, sizeof(struct stuff));
Run Code Online (Sandbox Code Playgroud)

另一个是单独访问每个成员:

custom_var.stuff_a = 0;
custom_var.stuff_b = 0;
Run Code Online (Sandbox Code Playgroud)

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

struct stuff custom_var = { 1, 2 };
Run Code Online (Sandbox Code Playgroud)

上面的代码相当于:

struct stuff custom_var;
custom_var.stuff_a = 1;
custom_var.stuff_b = 2;
Run Code Online (Sandbox Code Playgroud)


pmg*_*pmg 7

...使用默认值创建结构...

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


你提出的问题与int42的默认方式相同.

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

或者,适应你的榜样

/* 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 */
Run Code Online (Sandbox Code Playgroud)


Jon*_*Jon 6

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

 struct a {
     a() : i(0), j(0) {}   // constructor with initialization list
     int i;
     int j;
 }
Run Code Online (Sandbox Code Playgroud)

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

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

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