Ail*_*lyn 38 c struct initialization
鉴于:
struct objStruct {
int id;
int value;
};
typedef struct objStruct Object;
Run Code Online (Sandbox Code Playgroud)
是否有分配和初始化对象的快捷方式,比如C++构造函数?
它甚至可以是预处理器宏.无论是什么使代码更短,更可读:
Object *newObj = malloc(sizeof(Object));
// successful allocation test snipped
newObj->id = id++;
newObj->value = myValue;
Run Code Online (Sandbox Code Playgroud)
Jar*_*Par 47
在CI中,通常以构造函数的方式创建一个函数来执行此操作.例如(为简洁省略了错误检查)
Object* Object_new(int id, int value) {
Object* p = malloc(sizeof(Object));
p->id = id;
p->value = value;
return p;
}
...
Object* p1 = Object_new(id++, myValue);
Run Code Online (Sandbox Code Playgroud)
Jon*_*ler 26
在C99及更高版本中,您可以使用复合文字,它看起来像一个强制转换后跟一个初始值设定项:
int init_value = ...;
int init_id = ...;
Object newObj1 = (Object){ .value = init_value, .id = init_id };
Object newObj2 = (Object){ .id = init_id, .value = init_value };
Run Code Online (Sandbox Code Playgroud)
后两行达到相同的效果 - 字段的顺序并不重要.那是使用'指定初始值设定项',另一个C99功能.您可以在不使用指定初始值设定项的情况下创建复合文字.
小智 6
在C中,可以声明一个与结构同名的内联函数:
struct my
{
int a;
};
inline struct my* my(int* a)
{
return (struct my*)(a);
}
//somewhere in code
int num = 123;
struct my *sample = my(&num);
//somewhere in code
Run Code Online (Sandbox Code Playgroud)
它看起来非常类似于C++ ctors.