c - 定义 C 函数数组

标签 c arrays function definition

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

相关文章:

python - 从 numpy 数组创建 Pandas 数据框

function - 从 lisp 中的整数列表中消除每次出现的 x

javascript - 主循环函数不运行嵌套函数

c++ - 在线程之间重定向标准输入/输出

c - 给定示例程序的 objdump 输出中未显示重定位条目

java - Array Try Catch 无法识别 if 语句中的数组长度

java - 我怎样才能让这个程序在线性时间内运行?

c - 在函数调用中使用它时,将值添加到结构中的指针

c - 使用指向函数的指针进行数值积分始终返回 0

c - "strlen"在 C 中给出不同的结果