C 静态声明遵循非静态声明?
我知道它的基本原理,但我不熟悉C语言,我无法理解这个主题的答案 在C 静态声明遵循非静态声明?,c,C,我知道它的基本原理,但我不熟悉C语言,我无法理解这个主题的答案 在C文件中,我有以下功能: void uart_event_handle(app_uart_evt_t * p_event) { } static void uart_init(void) { } void initialize() { uart_init(); } 静态函数uart\u init()在某个示例程序main.c中,我正试图将其放入另一个c文件(此文件)
C
文件中,我有以下功能:
void uart_event_handle(app_uart_evt_t * p_event)
{
}
static void uart_init(void)
{
}
void initialize()
{
uart_init();
}
静态函数uart\u init()
在某个示例程序main.c
中,我正试图将其放入另一个c文件(此文件)中
只有在调用时才会发生错误:
uart_init()代码>。否则它将不会发生。声明一个函数static
会使它在翻译单元之外不可见。这类似于在类中声明私有字段,因为static
“隐藏”所有其他文件中的函数
这使您可以在其他文件中定义具有相同名称的新函数,而不必担心名称冲突。同时,static
使得无法从定义该函数的.c文件外部调用该函数
您的示例提供了一个生成静态函数的用例:initialize
成为库的“公共”接口的一部分,而uart\u init
保持隐藏。您是否试图从另一个.c
文件调用它?在这种情况下,您必须使用头文件摆脱静态和extern
函数。不,所有这些代码都在一个C文件中。在我从其他地方使用此文件之前,编译时就发生了错误。如果将uart_init
放入文件a.c
并从b.c
调用它,则需要删除static
您的注释“我正试图将其放入另一个c文件中”表明存在uart_init()声明
没有提供非静态声明的静态
存储类(可能在标题中),而您使用静态
对函数的定义试图覆盖该声明-未成功。当然,我们没有足够的可见代码来证明这一点。@Curnelious请提供一个。显然,这里没有人能够重现或(甚至理解)你的问题。顺便说一句,LPs并没有对你不尊重,他可能只是有点恼火,我也是。这是一个很好的解释,但我仍然从同一个C文件中调用静态函数。。。我在这里错过了什么?@Curnelious这不应该是个问题。您编译文件的方式一定有问题,因为独立的代码可以很好地编译。好的,我会更深入地检查并接受这一点。谢谢。@Curnelious这真奇怪-您可能需要检查源代码中是否所有大括号都是平衡的,并且没有缺少分号。@Curnelious这也可能意味着头文件中有一个声明,编译器选择忽略它,因为您没有进行调用。您可能希望尝试在启用所有警告的情况下进行编译,并将所有警告视为错误。