繁体   English   中英

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

[英]Can preprocessor directive #include be disabled/excluded?

例如:如果我有两个 .h 文件

process1.h 和 process2.h

它们包含两个具有不同输出变量的函数。

进程1.h:

function(int var)
 {
 return 2*var;
}

进程2.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

}

不,您不能“取消包含”文件。 将所有预处理器指令(以#开头的行)视为实际 C 编译器甚至看到源文件之前发生的情况。 它们只是对文件的文本进行操作,而预处理器可以作为一个单独的步骤来实现,它只是将新文本输入到实际的编译器中。

最好的方法来修改的动作include根据来电者是使用附带的文件中进一步宏,你可以#define包括面前。

尽管如此,您的整体语法仍处于关闭状态,您不能(通常)在 C 中嵌套函数。

不,您不应该尝试编写具有两个同名函数的程序。

在函数实际定义在头文件中的特殊情况下(而不仅仅是原型),您可以这样做:

#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() )。

为什么不使用函数指针数组。 当然你需要在开始时初始化它,但我认为它可能解决你想做的事情。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM