Plo*_*uff 5 c declaration lookup-tables
我最近写了一段像这样的C代码:
static void func1()
{
}
static void func2()
{
}
typedef void (*func_t)(void);
const func_t lookUpTable[FUNC_COUNT] =
{
[FUNC1] = &func1,
[FUNC2] = &func2
}
Run Code Online (Sandbox Code Playgroud)
另一个程序员在同一个文件上工作并将其更改为:
static void func1();
static void func2();
typedef void (*func_t)(void);
const func_t lookUpTable[FUNC_COUNT] =
{
[FUNC1] = &func1,
[FUNC2] = &func2
}
static void func1()
{
}
static void func2()
{
}
Run Code Online (Sandbox Code Playgroud)
由于funcN函数只通过查询表调用,我实际上并不需要这些函数的声明.
这是一个品味问题,还是一种被认为是好/坏做法的编码风格?
谢谢你的回答!
这确实主要是一个品味问题(编码风格在某种程度上总是一个意见问题;你的合作伙伴的风格与将所有代码放在所有其他定义之后的习惯一致)。
在实践中,您将更好地确保您的函数名称在整个程序中是唯一的(这使grep它们更容易使用 -ing,并且gdb更容易找到它们),即使它们仅在一个翻译单元内可见或使用。
顺便说一句,让您的函数成为非静态也有一些优点。例如,在 Linux 上,backtrace(3)和dladdr(3)函数更适合使用全局命名函数。
此外,有时计算的 goto和线程代码(甚至是普通的大...)比通过指针间接调用短switch函数的表分派更快。(调用函数的少量开销,例如运行其序言和尾声,有时可能对于小型且快速运行的代码很重要)。请参阅此处和那里的参考资料。