我是否应该认为声明所有 C 静态函数是一个好习惯?
Should I consider that declaring all C static functions is a good practice?
我最近写了一段这样的C代码:
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();
typedef void (*func_t)(void);
const func_t lookUpTable[FUNC_COUNT] =
{
[FUNC1] = &func1,
[FUNC2] = &func2
}
static void func1()
{
}
static void func2()
{
}
由于 funcN 函数仅通过查找调用 table,我实际上不需要这些函数的声明。
这是品味问题,还是有一种编码风格被视为 good/bad 实践?
这确实主要是品味问题(并且编码风格总是不知何故;你伙伴的风格与把所有代码放在一起的习惯是一致的在所有其他定义之后)。
在实践中,您最好确保您的函数名称在整个程序中是唯一的(这使 grep
-ing 更容易,并且 gdb
会更容易找到它们),即使它们只在一个翻译单元内可见或使用。
顺便说一句,让你的函数成为非静态的也有一些优势。例如,在 Linux 上,backtrace(3) & dladdr(3) 函数更适合使用全局命名函数。
另外,有时computed gotos and threaded code (or even a plain large switch
....) are faster than a table dispatch calling short functions indirectly thru a pointer. (The small overhead of calling functions, e.g. running their prologue and epilogue, might sometimes matter for tiny and quickly running code). See references & 。
我最近写了一段这样的C代码:
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();
typedef void (*func_t)(void);
const func_t lookUpTable[FUNC_COUNT] =
{
[FUNC1] = &func1,
[FUNC2] = &func2
}
static void func1()
{
}
static void func2()
{
}
由于 funcN 函数仅通过查找调用 table,我实际上不需要这些函数的声明。
这是品味问题,还是有一种编码风格被视为 good/bad 实践?
这确实主要是品味问题(并且编码风格总是不知何故;你伙伴的风格与把所有代码放在一起的习惯是一致的在所有其他定义之后)。
在实践中,您最好确保您的函数名称在整个程序中是唯一的(这使 grep
-ing 更容易,并且 gdb
会更容易找到它们),即使它们只在一个翻译单元内可见或使用。
顺便说一句,让你的函数成为非静态的也有一些优势。例如,在 Linux 上,backtrace(3) & dladdr(3) 函数更适合使用全局命名函数。
另外,有时computed gotos and threaded code (or even a plain large switch
....) are faster than a table dispatch calling short functions indirectly thru a pointer. (The small overhead of calling functions, e.g. running their prologue and epilogue, might sometimes matter for tiny and quickly running code). See references