我有两个.c文件名:Main.c和Test2.c。我在Main.c中定义了一个函数:void TestExtern2()
。我定义了另一个具有相同名称的函数,但它在Test2.c中是静态的:static void TestExtern2()
。我把声明:void TestExtern2();
放在头文件中。
我编译:
$ gcc Main.c Test2.c and get this error:
error: static declaration of 'TestExtern2' follows non-static declaration
有没有办法解决这个问题。我的意思是我想在头文件中提供函数声明,但也需要保持两个函数的名称相同。
答案 0 :(得分:2)
同一个函数不能在同一个翻译单元中声明为静态和非静态。如果Test2.c
真正需要一个名为TestExtern2
的静态函数,则它不能包含带有该函数冲突声明的头文件。
这并不妨碍您在头文件中声明(非静态)函数;它只是意味着包含静态版本的源文件不得包含标头,否则标头必须允许它使用条件编译来在必要时抑制声明的非静态版本。例如:
TestExtern.h
#ifndef TESTEXTERN_H
#define TESTEXTERN_H
#ifndef SUPPRESS_TESTEXTERN2
int TestExtern2(int);
#endif
#endif
test2.c中
#define SUPPRESS_TESTEXTERN2
#include "TestExtern.h"
static double TestExtern2(const char *s) {
/* ... */
}
请注意," TestExtern2"是static
函数的一个非常奇怪的名称,因为静态链接和外部链接是互斥的。同样理解,具有相同名称的两个不同功能本身并不会给您带来任何好处。尽管共享一个名称,但它们是不同的功能,并且在任何给定的翻译单元中,其名称的每个外观都将指代它们中的相同一个。但是,它很容易导致混淆,因为名称将引用不同翻译单元中的不同功能。
将不同的函数赋予不同的名称会更好,至少在有外部链接的情况下。