正确使用 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
中使用。
我正在做作业,我很难搞清楚一件事。我想编写可以使用整数或浮点数的 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
中使用。