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