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

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++的原因。过载

我有三个*.h文件:

A.h:

这个项目是一种框架

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

#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;
    }