C 仅当包含x.h文件时才调用类似free的函数
我有三个*.h文件: A.h: 这个项目是一种框架 有时我并不需要所有的模块——例如A、B或C,我只需要A和B模块。但我的框架初始化的结构如下:C 仅当包含x.h文件时才调用类似free的函数,c,C,我有三个*.h文件: A.h: 这个项目是一种框架 有时我并不需要所有的模块——例如A、B或C,我只需要A和B模块。但我的框架初始化的结构如下: #include "A.h" #include "B.h" <Frameworkname>Init(); <do some code here> <Frameworkname>Free(); 没有必要从freethemall()调用它,但它是解决此问题的某种线索 谢谢你的建议。 这就是他们创建C++的原因。过载
#include "A.h"
#include "B.h"
<Frameworkname>Init();
<do some code here>
<Frameworkname>Free();
没有必要从freethemall()调用它,但它是解决此问题的某种线索
谢谢你的建议。
这就是他们创建C++的原因。过载机制将很容易解决您的问题。 但是因为你必须用C语言,我知道的唯一方法就是使用一个位域Free(uint32 bitfield){
int i,masklen =32;
for (i=0;i<masklen;i++)
{
if (bitfield & 1<<i)
// call free for module i
// you can have an array of function pointers so that you easily get the right
// free function each time
}
}
Free(uint32位字段){
int i,masklen=32;
对于(i=0;i2种方式:
“hack”是在每个模块中做一个#define,或者如果您没有访问模块代码的权限,那么做一个#define USE_a和ifdef USE_a来实际包含标题。因此更改#define将确定是否包含标题,用于释放的函数将检查相同的定义
正确的方法是使用一个函数“注册”需要释放的项。一个指针数组。因此,当您创建每个指针时,您添加它的指针或指向将其释放到数组的函数的指针,然后当您需要释放时,您只需在数组中循环并释放每个指针
我认为你想要的是不可能的
在C++中,可能是因为对象的声明(无论是在报头还是模块中)都会导致代码被执行,但是在C中它不能。
如果你这样做
main.h:
typedef struct {
void (*init)(void) ;
void (*exit)(void) ;
} MODULE ;
A.h:
extern MODULE A ;
B.h
extern MODULE B ;
main.c:
#include "main.h"
#include "A.h"
#include "B.h"
MODULE modules[] = {
&A,
&B,
0,
} ;
然后在初始化、退出阶段迭代模块数组,为这些阶段调用适当的函数
这样,您只需维护2行。这是我能想到的最紧凑和可维护的方式。您可以创建初始化函数,该用户需要在程序启动期间调用。该函数将传递给用户将使用的模块。
您的库将存储这些信息,并在关机时调用相应的函数
例如:
/* Header file */
enum SmlModule {
SML_RASTER = 1,
SML_EVENT = 2,
SML_TIME = 4
}
int sml_init(int modules);
然后在程序中:
int main ()
{
sml_init(SML_RASTER | SML_TIME);
(...)
return 0;
}
例如,库使用了这种方法,请参见您可以使用页眉防护装置(无论如何都缺少)来解决您的问题:
通过如下方式修改标题来添加标题保护:
A.h:
\ifndef\u A\H
#定义
外部sometype1 somevar1;
#恩迪夫
B.h:
\ifndef\u B\H
#定义
外部sometype2 somevar2;
#恩迪夫
C.h:
\ifndef\u C\H
#定义_C_H
外部sometype3 somevar3;
#恩迪夫
我有D.c文件:
#include "A.h"
#include "B.h"
#include "C.h"
int freethemall()
{
TheFunctionFromAhFileForFreeingTheSomevar1Resources();
TheFunctionFromBhFileForFreeingTheSomevar2Resources();
TheFunctionFromChFileForFreeingTheSomevar3Resources();
}
#include "A.h" /* \ */
#include "B.h" /* \ */
#include "C.h" /* + <--- comment in/out here what is needed. */
... /* / */
#include "_n_.h" /* / */
int freethemall()
{
#ifdef _A_H
TheFunctionFromAhFileForFreeingTheSomevar1Resources();
#endif
#ifdef _B_H
TheFunctionFromBhFileForFreeingTheSomevar2Resources();
#endif
#ifdef _C_H
TheFunctionFromChFileForFreeingTheSomevar3Resources();
#endif
...
#ifdef __n__H
TheFunctionFromChFileForFreeingTheSomevar_n_Resources();
#endif
return 0;
}
#包括“A.h”/*\*/
#包括“B.h”/*\*/
#包括“C.h”/*+设计一个框架的概念,即哪些模块正在被使用,哪些头被包含,这是非常奇怪的。在我看来,包含头是被动的,它不应该改变程序的功能:我们有相应的函数。如果你只想包含需要释放的头文件,为什么不检查是否有一个常量def只有一个头文件中存在ined,如果存在,则释放模块的内容?@unwind:好的,我有下一个模块:smlMaster.h/c smlevents.h/c smltime.h/c
每个模块都有自己的函数,用于一些不同的事情。我在这个模块中有下一个变量:smlMaster SMlMaster;
SmlEvent SmlEvent;
SmlTime SmlTime;
每个变量都包含该模块所需的指针、数据、字符串和其他内容。但当程序结束时,我需要释放内存、调用必要的系统函数等。我该怎么做?我要说的是,使用指向寄存器中函数方法的指针,即points是一个特定于模块的函数,用于清除数据。我想你的意思是“无法通过”,没有什么是“不可能的”:此外,C++只是C的糖,它没有创建任何与C无关的新事物。它是所有的汇编程序。那么,没有什么是不可能的了。C++是糖的C?这对我来说是新闻。无论如何,我认为不可能只包含一个文件,并且使它在没有进一步引用的情况下执行代码。有些代码中的头可以从main()中访问,我确实明白你的意思,但是如果他可以访问源代码,你可以在.h文件中使用#defines,这些可以直接影响代码的执行#defines只能影响编译器转换成代码的内容。如果他(?)要#define ModuleAFree()作为一个空表达式,除非包含a.h,这有一定的用途。但这根本不是一个好的做法。我的解决方案允许您通过注释一行来启用/禁用模块。并且您可以更清楚地看到将要发生的事情。
Free(uint32 bitfield){
int i,masklen =32;
for (i=0;i<masklen;i++)
{
if (bitfield & 1<<i)
// call free for module i
// you can have an array of function pointers so that you easily get the right
// free function each time
}
}
main.h:
typedef struct {
void (*init)(void) ;
void (*exit)(void) ;
} MODULE ;
A.h:
extern MODULE A ;
B.h
extern MODULE B ;
main.c:
#include "main.h"
#include "A.h"
#include "B.h"
MODULE modules[] = {
&A,
&B,
0,
} ;
/* Header file */
enum SmlModule {
SML_RASTER = 1,
SML_EVENT = 2,
SML_TIME = 4
}
int sml_init(int modules);
int main ()
{
sml_init(SML_RASTER | SML_TIME);
(...)
return 0;
}
#ifndef _A_H
#define _A_H
<some types>
extern sometype1 somevar1;
#endif
#ifndef _B_H
#define _B_H
<some types>
extern sometype2 somevar2;
#endif
#ifndef _C_H
#define _C_H
<some types>
extern sometype3 somevar3;
#endif
#include "A.h" /* \ */
#include "B.h" /* \ */
#include "C.h" /* + <--- comment in/out here what is needed. */
... /* / */
#include "_n_.h" /* / */
int freethemall()
{
#ifdef _A_H
TheFunctionFromAhFileForFreeingTheSomevar1Resources();
#endif
#ifdef _B_H
TheFunctionFromBhFileForFreeingTheSomevar2Resources();
#endif
#ifdef _C_H
TheFunctionFromChFileForFreeingTheSomevar3Resources();
#endif
...
#ifdef __n__H
TheFunctionFromChFileForFreeingTheSomevar_n_Resources();
#endif
return 0;
}