仅当包含 x.h 文件时才调用类似自由的函数

标签 c

我有三个 *.h 文件:

啊:

<some types>
extern sometype1 somevar1;

B.h:

<some types>
extern sometype2 somevar2;

C.h:

<some types>
extern sometype3 somevar3;

我有 D.c 文件:

#include "A.h"
#include "B.h"
#include "C.h"

int freethemall()
{
    TheFunctionFromAhFileForFreeingTheSomevar1Resources();
    TheFunctionFromBhFileForFreeingTheSomevar2Resources();
    TheFunctionFromChFileForFreeingTheSomevar3Resources();
}

这个项目是某种框架。

有时我不需要所有模块 - A、B 或 C,例如,我只需要 A 和 B 模块。但我的框架初始化的结构如下:

#include "A.h"
#include "B.h"
<Frameworkname>Init();

<do some code here>

<Frameworkname>Free();

因此,从每个模块调用所有 Free 函数而不是仅调用一个 ...Free() 函数是非常非常不舒服的:

#include "A.h"
#include "B.h"
<Frameworkname>Init();

<do some code here>

<Frameworkname><modulename1>Free();
<Frameworkname><modulename2>Free();
..
<Frameworkname><modulenameN>Free();

在本例中,N 只有 2,但我有大约 20 个模块,因此将它们全部计数对程序员来说并不友好。

如何更改 freethemall() 函数以仅调用我使用和包含的模块的析构函数?请注意,D.h 包含该函数,并且有很多模块包含 D.h。

附注如果需要的话,我可以在每个其他模块中包含 D.h 模块。

作为解决这个问题的其他方法,我需要一个在模块完成之前调用的函数,就像在最后的 Delphi 语言中一样:

Unit ...

Finalization
   Callme;
End.

不需要从 freethemall() 调用它,但它是解决这个问题的某种线索。

感谢您的建议。

最佳答案

两种方式:

  1. “黑客”是在每个模块中执行 #define,或者如果您无权访问模块的代码,请执行 #define USE_A 和 ifdef USE_A 以实际包含 header 。因此,更改 #define 将确定 header 是否被包含,并且释放函数将检查相同的定义。

  2. 正确的方法是使用一个函数来“注册”您需要释放的项目。指针数组。因此,当您创建每个数组时,您可以添加它的指针或指向将其释放到数组的函数的指针,然后当您需要释放时,只需循环遍历数组并释放其中的每个数组即可。

关于仅当包含 x.h 文件时才调用类似自由的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19911079/

相关文章:

python - 解码勒索信(从 C 到 Python)

c - Malloc/free 双重释放或损坏错误

c - 在 C 中使用 qsort() 并跳过特定的字符集

c - 分别使用 sleep() 和 GetAsyncKeyState 函数

c - 在 Cygwin/MinGW 中安装/编译 - 如何设置包含 "path"? (符号链接(symbolic link)?)

C++ 和 Lua - 不 protected 错误(错误的回调)?这怎么可能

C 程序 - 导致指针崩溃

c - 两点之间的最短距离。蛮力算法

c++ - MacOS 上的视频捕获

c - 从 C 文件输入,数据类型