泛型的 C 头文件声明(宏)

C header declaration for generics (macro)

我不确定在哪里写声明和用函数替换代码的宏的调用。我真的不知道是否应该将宏写入 .h.c 文件。 在阅读有关创建库的最佳方法的一些内容之前,我只是将所有代码放在一个头文件中并将其包含在我的主文件中,即

#ifndef LIB
#define LIB
#define def_func(type)  \
  type func(type x)     \
  {                     \
    // Do something     
  }
  func(int)
#endif

一些其他函数使用这些定义的函数,所以我不得不调用宏到 .h 文件。

首先,我认为需要对问题的代码进行一些小的修改:

#ifndef LIB
#define LIB
#define def_func(type)  \
  type func(type x)     \
  {                     \
    /* Do something */  \
  }
  def_func(int)
#endif

这个问题没有详细说明 objective 正在实现什么,但我假设目标是创建一些行为类似于 C++ 中的模板的东西,其中代码在一个地方定义,实例是使用宏 def_func.

为不同类型创建

需要注意的一件事是,如果您在项目中多次使用 def_func,那么由于在多个地方使用相同的全局符号,您将遇到链接器错误,即使def_func 用于单独的文件中。如果多次使用 def_func 但在同一个文件中不超过一次,则可以通过使函数 static 来避免这种情况。虽然,这会限制从多个文件调用该函数。

也可以通过向 #define 添加另一个参数来避免全局符号重新定义,如下所示:

#define def_func(func, type) \
type func(type x)            \
{                            \
    /* Do something */       \
}

这将允许唯一指定函数标识符。例如:

def_func(func_int, int)

将扩展为:

int func_int(int x)
{                  
    /* Do something */
}

这样将为每个实例创建一个唯一标识符。

如果您打算使用多个 C 源文件中的宏,则应将 #define 放在头文件中。该宏应仅在 C 源文件中使用,因为在头文件中使用它会在头文件包含的每种情况下实例化具有相同全局符号的对象。虽然,如果函数定义为 static.

,这是允许的

最后,如果您计划调用从多个位置创建的函数,您将需要一个宏,该宏可用于与定义函数的模块相关联的头文件中,以对函数进行原型设计。例如:

#define def_func_proto(func, type) \
  type func(type x)

总而言之,您的库 .h 文件将包含:

#define def_func(func, type) \
type func(type x)            \
{                            \
    /* Do something */       \
}

#define def_func_proto(func, type) \
type func(type x)

那么以整数为例,C源文件可能包括:

def_func(func_int, int)

展开为(注意实际展开不会有换行符):

int func_int(int x)
{                  
    /* Do something */
}

在这种情况下,头文件可能包含:

def_func_proto(func_int, int);

这将扩展为:

int func_int(int x);

最后,我要指出的是,总体而言,我不确定这是否是一个好的编程习惯。在您的程序中实现它时您需要非常谨慎。