我是否认为声明所有C静态函数是一个很好的实践?

我是否认为声明所有C静态函数是一个很好的实践?,c,declaration,lookup-tables,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 } 另一个程序员处理同一个文件,并将其更改为: static void func1(); static void fu

我最近写了一段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函数只通过查找表调用,所以我实际上不需要这些函数的声明


这是一个品味的问题,还是有一种编码风格被认为是一种好的/坏的做法?

这实际上主要是一个品味的问题(而且编码风格在某种程度上总是一个意见的问题;你伴侣的风格与将所有代码放在其他定义之后的习惯是一致的)

在实践中,您最好确保您的函数名在整个程序中是唯一的(这使
grep
-ing更容易,而
gdb
将更容易找到它们),即使它们在一个翻译单元中可见或仅使用

顺便说一句,让你的函数是非静态的也有一些好处。例如,在Linux上,&函数更适合使用全局命名函数


而且,有时and(甚至是一个普通的大
开关
…)比表分派通过指针间接调用短函数要快。(调用函数的小开销,例如运行其序言和尾声,有时可能会影响到小而快速运行的代码)。请参阅引用&。

将它们设置为“静态”仍然是一种良好的做法,因为它可以避免污染全局名称空间。并非总是这样。一些程序正在使用
回溯
(例如,对于解释器中的错误报告),然后将所有函数公开是明智的(在这种情况下,您将只有
静态内联
函数,其余是全局函数)
静态内联
是另一回事(注意这是C)。如果您正在进行调试,那么无论如何都不应该使用某些优化(对于gcc,请使用
-Og
)。感谢您给出这个令人惊讶的答案!您知道我使用了查找表来提高运行时效率。它用于嵌入式软件的有限状态机。到目前为止,我们达到了我们需要的效率。您提供的参考资料今天可能不需要,但非常有趣!感谢钓鱼课:)“它用于嵌入式软件的FSM”-使用
开关
实现可能更好(更紧凑、更快)。请注意,在速度更快的MCU(通常是32比特,如ARM Cortex-M)上,闪存访问具有等待状态,数据访问的缓存很差(例如STM32)。“我实际上不需要声明”-您仍然需要!如果没有tem,则无法在表中使用tem。省略
static
OTOH不会使声明外部化,只会使名称/符号外部化。此处可能存在词汇问题。如果我说“我不需要原型”会更好吗?我的意思是,当我定义函数时,它们同时被声明。这是你观点的一部分吗?关于您评论的最后一部分:这是否意味着如果没有
静态
,名称/符号将是公共的。因此,如果在另一个翻译单元中使用此名称,那么编译将中断,因为找不到主体/实现(?)?1)使用
@name
可靠地添加注释。你最后的评论并没有让我更清楚。也许我最初的评论会变得更加清晰,因为我倾向于使用标准的C词汇表。看看吧。您确实需要原型(即声明)。如果没有
静态
,则在文件范围中声明的名称具有外部链接。“public”一词不被标准使用(在C++中有不同的含义)。@Olaf:不幸的是,我自学了编程。所以我仍然有空白需要填补。如果可能的话,我会看看C标准。谢谢