在编译时选择一个函数

时间:2009-10-28 22:33:24

标签: c function c-preprocessor

在我的C项目中,我有五个不同的函数(具有相同的名称),它们以不同的方式实现一种算法。在编译时,我只需要选择其中一个函数。 我可以使用#define和一堆#ifndef来实现这一点吗?有更好的方法吗?

9 个答案:

答案 0 :(得分:15)

可能更优雅的方法是用5个不同的名称(例如f1,f2,f3,f4,f5)定义它们,但总是使用相同的不同名称(例如f)调用该函数。然后编译类似:

gcc -Df=f1

这会将对f()的任何调用编译为对f1()的调用。

答案 1 :(得分:5)

是。你所做的就是在代码中说出来:

#if defined(FUNC1)
    ...func1 here
#elif defined(FUNC2)
    ...func2 here
...ect. ect.
#endif

然后在编译时添加gcc选项-DFUNCX,例如:

gcc -DFUNC1 -o myprogram myfile.c

然后,您可以通过更改放在-D选项中的值来选择要编译的函数。这是很常见的做法。

答案 2 :(得分:3)

您不能在一个翻译单元中定义两个具有相同名称的不同功能。

所以我猜你已经把不同源文件之间的功能分开了。只需在编译时包含所需的文件...例如,使用gcc

gcc -o testsort main.c bubble.c
gcc -o testsort main.c merge.c
gcc -o testsort main.c radix.c

bubble.cmerge.cradix.c(以及其他)中的任何一个具有相同名称的函数:

int sort(int *data, size_t len) { /* ... */ }

答案 3 :(得分:1)

在C中,这是我知道这样做的唯一方法。 C ++你会很幸运。

答案 4 :(得分:1)

如果你有单独文件中的函数源(对于我的例子,在f1.c和f2.c中),那么这个方案有效:

$ cat so.c
#define STRINGIZER(x) #x
#define HEADER(x) STRINGIZER(x)

#include HEADER(SOURCE)

int main(void)
{
    return(function());
}
$ cat f1.c
static int function(void)
{
    return(1);
}
$ cat f2.c
static int function(void)
{
    return(2);
}
$

然后我可以像这样编译:

$ gcc -DSOURCE=f1.c -o so1 so.c
$ gcc -DSOURCE=f2.c -o so2 so.c

注意使用stringize运算符和双宏舞 - 这是标准C预处理器的标准习惯用法。它允许我避免在C编译器命令行中输入引号;想想如果你不得不写下来会有多难:

$ gxx -DSOURCE='"f1.c"' -o so1.c

运行so1和so2的结果是:

$ ./so1; echo $?
1
$ ./so2; echo $?
2
$

这显示了一种在没有任何#ifdef行的情况下实现所需结果的替代方法。

答案 5 :(得分:0)

ifndef宏似乎是编译时唯一的可能性。

您可以在运行时尝试使用函数ptrs。

只是想到你可以在不同的文件中创建每个功能,并随时链接正确的功能。没有宏,只是一个Makefile开关。这样您就可以保持相同的签名并在链接时确定要使用的实现。链接algo1.o或链接algo2.o ...

答案 6 :(得分:0)

如果我是你,我会有5个不同的函数名,然后使用if语句来确定在运行时调用哪一个。

答案 7 :(得分:0)

C没有重载(运算符或其他),因此没有其他方法可以执行此操作。我担心你会遇到预处理器命令。

答案 8 :(得分:0)