可以禁用/排除预处理程序指令#include吗?

时间:2011-11-29 10:29:33

标签: c c-preprocessor preprocessor-directive

例如:如果我有两个.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

}

3 个答案:

答案 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;
}