我有一堆 C 函数,它们被分配给一个函数指针数组,如下所示:
typedef int (*func)(int);
int SomeLongName1(int a) {
// ...
}
// ...
int SomeLongName1000(int a) {
// ...
}
func f[] = { SomeLongName1, ... , SomeLongName1000 };
这需要大量工作来创建并且容易出错。例如,函数名称中可能存在拼写错误,因此仍然命名了一个有效的函数,但却是错误的。或者,如果在末尾添加了一个新函数,人们可能会忘记进入并将其显式添加到函数指针列表中。
为了避免必须显式声明函数指针数组,我尝试了各种技巧,例如宏,这使代码难以理解并且需要了解宏的工作原理,我通常对它们不满意。
我想做的是这样的:
typedef int (*func)(int);
func f[] = {
int SomeLongName1(int a) {
// ...
}
// ...
int SomeLongName1000(int a) {
// ...
}
};
这样,数组会自动创建,如果有某种方法可以在末尾放置一个空指针,这样我就可以确定有多少个函数指针,那也很好。
但是,以上不是有效的 C,我想不出任何方法来完成它。如果它是特定于编译器的东西(例如 GCC 扩展),那没问题。
所有函数在编译时都是静态已知的,所以我想避免必须对函数指针数组进行任何运行时初始化 - 并不是说我已经找到了这样做的方法。
这个相关问题How to define an array of functions , 似乎在问同样的问题,但没有得出合乎逻辑的结论。具体来说,我不想为了节省时间和避免错误而重新输入我已经输入的任何内容。
最佳答案
如果您不关心数组中函数的顺序,并且愿意使用 GCC 扩展,那么您可以使用一大堆初始化(构造)函数来实现您想要的。这显然不理想,因为定义了过多的额外函数,但它肯定是您可以考虑的一种方法。它在运行时构造数组。
定义函数 append
以将单个函数附加到数组(如果需要则重新分配)。那么,代码基本上就是
#define ARRAYFUNC(name) int name(int); \
void __attribute__((constructor)) __init_##name(void) { append(func); } \
int name(int a)
ARRAYFUNC(func1) {
...
}
ARRAYFUNC(func2) {
...
}
关于c - 定义 C 函数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18793726/