例如:如果我有两个.h文件
process1.h和process2.h
它们包含两个具有不同输出变量的函数。
process1.h:
function(int var)
{
return 2*var;
}
process2.h:
function(int var)
{
return 10*var;
}
可以在main.c中完成:
int main()
{
int a = 2;
#include "process1.h"
printf("%d",function(a)); //output is 4
EXCLUDE #INCLUDE "process1.h" ????? <----can this be done in any way??
#include "process2.h"
printf("%d",function(a)); //output is 20
}
答案 0 :(得分:6)
不,你不能“取消包含”一个文件。将所有预处理器指令(以#
开头的行)视为之前实际C编译器甚至可以看到源文件。它们只是对文件的文本进行操作,预处理器可以作为一个单独的步骤实现,只是将新文本提供给实际的编译器。
根据调用者修改include
操作的最佳方法是在包含的文件中使用更多宏,在包含它们之前可以#define
。
但是,您的整体语法已关闭,您无法(通常)在C中嵌套函数。
答案 1 :(得分:3)
不,你不应该尝试编写一个包含两个同名函数的程序。
在特殊情况下,函数实际上是在头文件中定义的(而不仅仅是原型),可以执行此操作:
#define function function_file1
#include "file1.h"
#undef function
#define function function_file2
#include "file2.h"
#undef function
int
main (void)
{
int a = 2;
printf ("%d\n", function_file1 (a));
printf ("%d\n", function_file2 (a));
}
但是如果你重命名一个函数原型,那么你实际上并没有重命名真正的函数,所以当你链接时你会得到未定义的符号错误。
在任何情况下,如果您使用相同的名称定义了两个函数,那么无论如何它都不会链接,无论您在源代码中做了什么。 (在C ++中,有时可以定义两个具有相同名称的东西,但是One-Definition-Rule意味着允许链接器假设它们实际上是同一个东西而只选择一个。)
这就是为什么库应该使用不会在其他地方使用的名称 - 通常是通过为所有符号名称添加公共前缀(例如my_unique_lib_initialize()
)。
答案 2 :(得分:0)
为什么不使用函数指针数组。当然你需要在开始时初始化它,但我认为它可能解决了你想要做的事情。
int process1_function(int var);
int process2_function(int var);
int main(void)
{
int i, a = 10;
int (* functions[2])(int);
functions[0] = process1_function;
functions[1] = process2_function;
for(i=0; i < 2; i++)
{
printf("%d", (functions[i])(a));
}
return 0;
}
如果您不需要动态更改要调用的函数,也可以只为函数添加前缀:
int process1_function(int var);
int process2_function(int var);
int main(void)
{
printf("%d",process1_function(a));
printf("%d",process2_function(a));
return 0;
}