gpt4 book ai didi

c - 定义 C 函数数组

转载 作者:太空狗 更新时间:2023-10-29 17:08:14 26 4
gpt4 key购买 nike

我有一堆 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com