【问题标题】:Naming convention for constructors and destructors in C [closed]C中构造函数和析构函数的命名约定[关闭]
【发布时间】:2012-09-17 00:38:59
【问题描述】:

假设我有一个struct list,我想提供一个“构造函数”和一个“析构函数”函数。我应该如何分别命名它们?

void list__init(struct list * self);
void list__construct(struct list * self);
void list__create(struct list * self);
...

void list__done(struct list * self);
void list__destruct(struct list * self);
void list__destroy(struct list * self);
...

是否存在在现实世界中占主导地位的既定命名约定?

【问题讨论】:

  • 是构造和销毁负责分配和释放还是只是初始化?我更喜欢模仿 C++ 并让 type_new() 和 type_delete() 与 _new 返回一个指针 (FWIW)。
  • 您知道有 C++ 编译器会发出 C 代码吗?只是说...
  • 我认为 C++ 是不可能的......
  • 创建/销毁、初始化/uninit、分配/释放...可能性无穷无尽。
  • @hmjd 我想模仿构造函数和析构函数。客户端负责通过self提供内存。

标签: c constructor naming-conventions destructor


【解决方案1】:

GLib/GTK 的人们已经创建了使用_new 和_free 分配内存的构造函数和析构函数以及使用_init 和_destroy 分配非内存分配构造函数和析构函数的约定。

pthread 库似乎大多遵循_init 和_destroy 用于非内存分配的约定,_create 用于内存分配。

X11 使用XOpenFoo 和XCloseFoo。

C 库本身使用free 用于对glob_t 和wordexp_t 等结构进行非内存分配清理。

所以,我想答案是否定的,但肯定有很多人在某些项目中选择了特定的符号。

【讨论】:

    【解决方案2】:

    没有普遍接受的约定。

    当然,C++ 在这件事上影响了人们的看法。

    就个人而言,我在函数执行内存分配时使用 new(),如果不执行,则使用 init(),如果发生释放,则使用 delete(),否则使用 cleanup()。

    【讨论】:

      【解决方案3】:

      我使用以下约定:

      • 通过..._alloc()分配内存
      • 通过..._init()初始化
      • 通过..._create()组合分配和初始化
      • 通过..._discard()释放相关资源
      • 通过..._dealloc() 或..._free() 释放内存
      • 通过..._destroy()联合释放资源和内存

      【讨论】:

      • 与接受的答案相比,我个人更喜欢这个答案中的 _create 变体。但是,我会使用 _cleanup 而不是 _discard,并且更喜欢 _free 而不是 _dealloc(类似于 malloc/free)。
      【解决方案4】:

      我在一家使用 init / deinit 作为标准的公司工作,这似乎很好。我想我从不止一个来源看到过init / fini,据我所知,这是一种使名称长度相同的自负。

      pthread_mutex_init / pthread_mutex_destroy(就地初始化)

      sem_create / sem_destroy(返回一个新句柄,但请注意 Posix 并不认为需要区分释放句柄的“销毁”和就地销毁的“销毁”)

      mpz_init / mpz_clear(就地初始化)

      所以你可以做你喜欢做的事,没有人可以合理地抱怨你无视“标准”。

      【讨论】:

        【解决方案5】:

        根据是在“对象”还是某个“活动模块”上,我通常会遵循

        对象:

        INIT <----> TERMINATE
        

        活动模块:

        INIT ---------> START 
         ^                ^
         |                |    
         |                v 
        TERMINATE <----- STOP
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-03
          • 2010-12-16
          • 2016-09-09
          • 1970-01-01
          • 1970-01-01
          • 2013-07-31
          • 2013-08-26
          相关资源
          最近更新 更多