初始化C结构时的术语

初始化C结构时的术语,c,initialization,terminology,C,Initialization,Terminology,这将是一个简单的问题,但谷歌搜索似乎并不能为我提供答案。我在C中的理解是,当foo是一个结构时,我们有两种方法来初始化foo对象。查看下面的代码以获取示例 typedef struct foo { int var1; int var2; char* var3; }foo; //initializes and allocates a foo foo* foo_init1(int v1,int v2,const char* v3) { if(..some checks..)

这将是一个简单的问题,但谷歌搜索似乎并不能为我提供答案。我在C中的理解是,当foo是一个结构时,我们有两种方法来初始化foo对象。查看下面的代码以获取示例

typedef struct foo
{
   int var1;
   int var2;
   char* var3;
}foo;

//initializes and allocates a foo
foo* foo_init1(int v1,int v2,const char* v3)
{
   if(..some checks..)
      return 0;
   foo* ret = malloc(sizeof(foo));

   ret->var1 = v1;
   ret->var2 = v2;
   ret-var3 = malloc(strlen(v3)+1);
   strcpy(ret->var3,v3);

   return ret;
}

// initializes foo by ... what? How do we call this method of initialization?
char foo_init2(foo* ret,int v1,int v2, const char* v3)
{
   //do some checks and return false
    if(...some checks..)
         return false//;assume you defined true and false in a header file as 1 and 0 respectively
   ret->var1 = v1;
   ret->var1 = v1;
   ret->var2 = v2;
   ret-var3 = malloc(strlen(v3)+1);
   strcpy(ret->var3,v3);

   return true;
}
所以我的问题是。我们如何在C中引用这些不同的初始化方法?第一个函数返回一个指向foo的初始化指针,因此,如果希望堆上有一个foo对象,那么很容易使用它:

foo* f1 = foo_init1(10,20,"hello");
但是第二个需要一个foo。。什么?请看下面的代码

foo f1;
foo_init2(&f1,10,20,"hello");
因此,第二种方法可以很容易地初始化堆栈上的对象,但是如何调用它呢?这基本上是我的问题,如何引用第二种初始化方法

第一个函数分配并初始化指向foo的指针。 第二个函数通过以下方式初始化一个foo。。。什么?推荐人


作为一个额外的问题,当你们用C编写代码时,你们是如何工作的?您是否确定正在制作的对象的用途,并由此确定是否应该具有类型1或类型2的初始化函数,甚至两者都有?

我不确定这两种方法是否有定义良好的术语,
在第一种方法中,函数动态分配结构并将值分配给成员,
而在第二种情况下,在函数之前分配结构,然后函数只为成员分配值

您是否确定正在创建的对象的用途,并由此确定是否应该具有类型1、类型2或甚至两者的初始化函数

选择第一种或第二种方法取决于一个重要的区别:

当需要跨作用域传递返回的结构时,首选第一种方法,堆上的内存必须显式释放,直到数据占优势为止,而在第二种方法中,一旦传递对象的作用域结束,堆栈上的数据就会被删除。

由于评论中没有人接受将其评论转化为答案的提议,我不得不回答自己的问题

基本上,一个可能的答案是,正如AIs声明的那样,没有特定的命名约定。当然,无论使用何种命名方法,都应该是:

  • 为清晰起见,在所有项目中保持一致
  • 可被其他程序员识别为执行实际操作的函数
为了实现这一目标,评论中提出了一些很好的建议。当一个foo对象是:

  • 传递给函数内部的初始化:foo_init
  • 在函数内部分配,并返回一个指针:foo_alloc、foo_make、foo_new
我想以上所有内容都很清楚,但最准确地描述函数中发生的事情的应该是foo_init和foo_alloc

就我个人而言,我真的不喜欢alloc解决方案,因为我不喜欢它在我的代码中的外观,所以我决定在函数后面添加动词_create而不是alloc来表示它在做什么


但我想答案归结起来是个人偏好。只要函数的功能通过读取其名称来明确,所有这些都应该是可以接受的。

对于分配的函数,我喜欢称它们为
\u new
,对于不分配的函数,我喜欢称它们为
\u init
。另外,让
\u new
在内部调用
\u init
,使代码更易于维护。(有时我称之为
\u make
而不是
\u new
)嘿,克里斯,你对他们的称呼很有洞察力。你为什么不给我一个答案,这样我就可以投票支持它,也可以让有相同问题的用户看到它?也。。。是否没有标准的方式供人们参考?我希望有人查看我的代码(因为它是一个API),立即了解函数的不同用法name@ChrisLutz:为了清楚起见,您将
\u new
\u init
附加到类型名称,对吗(
foo\u new
foo\u init
)?否则,您将与保留给实现的标识符发生冲突。(我相信你知道这一点,其他人可能不知道。)是的,他知道><但我想澄清在问答中是非常重要的site@ChrisLutz“new”在C中没有任何意义,因此在传达意图时是次优选择。分配和初始化就是你所说的,而foo_alloc()和foo_init()对于C语言的使用者来说都是可以立即理解的,并且完全不会弄错。嘿,谢谢你的回答。我知道这两种不同方法的区别,所以我的问题是如果你说。。。你需要做你在最后一段中说的两件事。您是否拥有这两个初始化函数,并在适当时使用每一个?另外,由于我不是以英语为母语的人,你能给我一个术语来命名第二个函数吗。这是我提出这个问题的主要原因,因为我想在我的代码库中命名函数