我有一堆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,似乎问了同样的问题,但没有把它带到它的逻辑结论.具体来说,我不想重新键入我已输入的任何内容,以节省时间并避免错误.
解决方法
我将用什么来解决这种情况(当然,当我无法避免它时),就是使用预处理.不是C预处理器提供的那个,它没有在合理的语法中提供所需的功能,而是像m4这样非常强大的功能.
使用m4,您的代码可能如下所示:
define(`functionList',`,0') define(`functionArrayMember',`define(`functionList',`$1,'FunctionList)$1') define(`buildFunctionArray',`{ functionList }') int functionArrayMember(SomeLongName1)(int a) { return a+1; } //... int functionArrayMember(SomeLongName1000)(int a) { return a+1; } func f[] = buildFunctionArray();
您只需要为functionArrayMember()和buildFunctionArray()提供正确的m4定义,并且您具有所需的功能.