【发布时间】:2017-12-02 19:36:34
【问题描述】:
不幸的是,在 C 中没有任何智能指针.. 但是是否可以构建一个宏来包装变量声明并在离开声明变量的范围时将该变量作为输入变量调用函数调用?
对不起,这句话很长,但我正在研究 xnu 内核,其中有许多具有内置引用计数器的元素,并且在使用它时一定不要忘记取消引用该元素以避免内存泄漏。
例如,如果我有以下类型的proc_t:
struct proc;
typedef struct proc * proc_t;
我想在一个作用域内声明一个基于该类型的栈变量,例如:
{
proc_t_release_upon_exit proc_t proc_iter = proc_find(mypid);
//the rest of the code in this scope
}
在预处理器分析宏和编译之前,我期望生成以下代码:
{
proc_t myproc = proc_find(mypid)
//the rest of the code in scope
proc_rele(myproc);
}
有没有办法像在 C 中那样定义这样的宏?
【问题讨论】:
-
这是不可能的,因为您希望在两个地方(入口和出口)有代码,而宏只能在一个地方。
-
使用 C 的工作方法不同。没有必要发明这样的宏。您拥有完全的控制权,因此您可以制作快速的软件——不要猜测它现在在做什么以及为什么慢。
-
你可以很容易地争论 C 没有智能指针是否是 不幸 - 我认为这是幸运的。
-
C 和 C++ 的主要区别实际上是 C++ 获得了“RAII”(析构函数的自动调用)。大多数其他 C++ 特性(例如封装或多态性)都可以在 C 中实现,但不能在 RAII 中实现。
-
如果你需要这个你不需要使用C。