定义C函数数组

前端之家收集整理的这篇文章主要介绍了定义C函数数组前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一堆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定义,并且您具有所需的功能.

猜你在找的C&C++相关文章