我有一段代码,我可以在不同的头文件中定义的不同数据集上使用相同的函数。这些头文件可能具有不同的定义相同的变量。
我可以在调用它时将参数传递给代码,以指定我想要执行该功能的数据集。
我想要做的是将此参数传递给代码,如果参数等于X,则使用headerX,或者如果参数等于Y,则使用headerY。
据我了解,头文件必须包含在MAIN之前。是否可以在MAIN之后包含头文件,以便我可以编写if / else语句来确定我调用哪个头文件?
如果我不能那样做那么请帮我解决这个问题。
答案 0 :(得分:1)
您可以使用#ifdef - blocks来确定在编译之前要使用的数据集。但是,如果您需要不同的数据集,则需要通过更改该定义来更改(重新编译)可执行文件。
否则你需要在C ++中编译,因为直接C不支持重载函数。
答案 1 :(得分:1)
简单地说,你就是不能。您可以根据条件预先包含标题。只需在文件顶部使用#if-def块。
但你不能像其他一样包括它:
这是错误的
if(x == 1)
#include "header1.h"
else
#include "header2.h"
但您可以在文件顶部执行此操作:
#if SYSTEM_1
#include "system_1.h"
#elif SYSTEM_2
#include "system_2.h"
#elif SYSTEM_3
#include "system_3.h"
#endif
或者你可以使用支持重载函数的C ++。
答案 2 :(得分:0)
您可以使用宏预处理阶段进行简单的元编程。用类似
的东西创建一个“interface_myFunc.h”#define FUNCNAME(T) myFunc_ ## T
void FUNCNAME(theType)(theType t);
创建一个类似
的“implement_myFunc.h”文件void FUNCNAME(theType)(theType t) {
// do something with t
}
然后将此文件包含在另一个文件“myFunc.h”
中#define theType toto
#include "interface_myFunc.h"
#undef theType toto
#define theType tutu
#include "interface_myFunc.h"
#undef theType tutu
和定义相似,“myFunc.c”
#define theType toto
#include "implement_myFunc.h"
#undef theType toto
#define theType tutu
#include "implement_myFunc.h"
#undef theType tutu
Modern C,C11,还可以为您通过所谓的类型通用宏创建的所有这些函数创建公共接口:
#define myFunc(X) \
_Generic((X), \
toto: FUNCNAME(toto), \
tutu: FUNCNAME(tutu) \
)(X)