C语言中结构的构造函数

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)

  • 是; 除了有时最好让"构造函数"将Object*作为参数,所以你也可以进行堆栈分配(`Object object; Object_initialise(&object);`). (10认同)
  • 它可能有点矫枉过正,但我​​通常也会创建一个void objStruct_destroy(objStruct*obj),它对我来说是免费的,以防我需要为以后分配的结构添加任何释放. (6认同)
  • 中间方法是使用Object_Init对已经分配的对象(=放置构造函数)执行初始化,使用Object_New来分配和初始化(在内部它应该调用Object_Init).对于"析构函数"也应该这样做. (2认同)

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.