正确使用 ifdef 为不同类型的值编写相同的函数,而无需多次编写

Right usage of ifdef to write the same function for different type of values, without writing it more than once

我正在做作业,我很难搞清楚一件事。我想编写可以使用整数或浮点数的 BST。 对于这样的练习,我们有不同的整数、浮点数和树本身的头文件。

我正在尝试根据我目前正在使用的类型 [int/float] 为 运行 的函数创建一种方法,而无需将其编写两次。所以我得到了这样的东西:

void addItemToTree(BST* bst, void* val) 
{
#ifdef IsInt
    addItemToTreeRec(bst->head, *((int*)val));
#else
    addItemToTreeRec(bst->head, *((float*)val));
#endif
}

到目前为止没有问题,导致:

#ifdef IsInt
void addItemToTreeRec(node* my_node, int val)
#else
void addItemToTreeRec(node* my_node, float val)
#endif
{
-- function itself ---
}

但问题是,包含所有整数相关结构和声明的头文件无法识别我的函数,而浮点头文件可以。 我认为它必须与我放下 ifdef 的方式有关,但我似乎无法解决它而不必复制整个代码并将其放在 #else

之前

注意:预处理器宏在 编译之前展开。您不能更改函数定义并在 运行 时调用函数的不同版本。


如果这仍然是您正在寻找的东西,您可以使用参数列表中的 #ifdef/#else 指令来选择第二个参数应该是哪种类型,而无需实际定义不同的类型函数:

#define IsInt

void addItemToTreeRec (node* my_node,        // Function declaration addItemToTreeRec. 
#ifdef IsInt 
int 
#else
float 
#endif
val
);

void addItemToTreeRec (node* my_node,        // Function definition addItemToTreeRec.
#ifdef IsInt 
int 
#else
float 
#endif
val
)
{
    #ifdef IsInt
    // Code if val is of type int.
    #else
    // Code if val is of type float.
    #endif
}

void addItemToTree ( BST* bst,           // Function declaration addItemToTree.
#ifdef IsInt     
int 
#else            
float 
#endif 
val
);

void addItemToTree ( BST* bst,           // Function definition addItemToTree.
#ifdef IsInt     
int 
#else            
float
#endif 
val
)
{
    addItemToTreeRec (bst->head, 
#ifdef IsInt
    *((int*)val)
#else
    *((float*)val)
#endif
    );
}

注意:这不是必须要看成后续代码的。您可以将声明放入特定的头文件中,也可以将定义放入不同的源文件中,但是 addItemToTreeRec 至少需要在 addItemToTree 之前进行前向声明,因为它在 addItemToTree 中使用。