我有三个 *.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() 调用它,但它是解决这个问题的某种线索。
感谢您的建议。
最佳答案
两种方式:
“黑客”是在每个模块中执行 #define,或者如果您无权访问模块的代码,请执行 #define USE_A 和 ifdef USE_A 以实际包含 header 。因此,更改 #define 将确定 header 是否被包含,并且释放函数将检查相同的定义。
正确的方法是使用一个函数来“注册”您需要释放的项目。指针数组。因此,当您创建每个数组时,您可以添加它的指针或指向将其释放到数组的函数的指针,然后当您需要释放时,只需循环遍历数组并释放其中的每个数组即可。
关于仅当包含 x.h 文件时才调用类似自由的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19911079/