2011-11-29 62 views
2

例如:如果我有两个.h文件预处理程序指令#include是否被禁用/排除?

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 

} 

回答

6

不,你不能“未包括“ 一份文件。考虑所有的预处理指令(#开始的行)之前实际的C编译器甚至可以看到源文件。他们只是对文件的文本进行操作,并且预处理器可以作为一个单独的步骤来实现,只是将新文本输入到实际的编译器中。

根据调用者的不同,修改include操作的最佳方式是在包含文件中使用更多的宏,在包含它们之前可以使用#define

尽管如此,你的整体语法是关闭的,你不能在C.

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; 
} 
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())。