我有一个 C 头文件(.h):
typedef uint8_t paraFunction(uint8_t paraVal, uint8_t paraNum);
paraFunction *paraCallTable[256];
我有一个 C 源文件 (.c):
paraFunction *paraCallTable[] = { fn1, fn2, ... fn255, fn256 };
但是,数组最终位于数据部分。我希望它位于代码/闪存中,因为函数地址(数组数据)是常量。该数组由其他源文件中的函数使用。
我该如何重写这些声明以使其全部不变?它们需要放在哪里(.c 还是 .h)?
我在 Google 上搜索并尝试了无数种不同的方法,但显然我还是不明白。
由于您已经在使用最清晰(IMHO)的函数指针形式,因此只需在右侧
typedef
添加声明即可,就像您对希望最终进入 ROM 的对象指针一样:const
*
如果你使用了 形式,
typedef uint8_t (*paraFunction)(uint8_t paraVal, uint8_t paraNum);
那么你就必须使用不那么明显和令人困惑的形式const paraFunction paraCallTable[]
。这是一个指向数据的只读指针,而不是人们可能认为的只读数据或指向只读数据的指针。这是坚持
typedef
您已在使用的良好风格的有力论据。我们还可以注意到,始终将函数指针表声明为
* const
ROM 或非 ROM 是一种很好的做法,因为在运行时更改函数指针通常是不希望的。