我有两个 .c 文件名:Main.c 和 Test2.c。我在 Main.c 中定义了一个函数:void TestExtern2()
。我定义了另一个具有相同名称的函数,但它是静态的:static void TestExtern2()
in Test2.c。我将声明:void TestExtern2();
放在头文件中。
我编译:
$ gcc Main.c Test2.c and get this error:
error: static declaration of 'TestExtern2' follows non-static declaration
有没有办法解决这个问题。我的意思是我想在头文件中提供函数声明,但还需要保持两个函数的名称相同。
最佳答案
同一个函数不能在同一个翻译单元中同时声明为静态和非静态。如果您的 Test2.c
确实需要一个名为 TestExtern2
的静态函数,那么它不得包含带有该函数声明冲突的头文件。
这并不妨碍您在头文件中声明(非静态)函数;它只是意味着包含静态版本的源文件不能包含 header ,否则 header 必须允许它使用条件编译来在必要时抑制声明的非静态版本。例如:
测试外部.h
#ifndef TESTEXTERN_H
#define TESTEXTERN_H
#ifndef SUPPRESS_TESTEXTERN2
int TestExtern2(int);
#endif
#endif
测试2.c
#define SUPPRESS_TESTEXTERN2
#include "TestExtern.h"
static double TestExtern2(const char *s) {
/* ... */
}
但是请注意,“TestExtern2”对于 static
函数来说是一个非常奇怪的名称,因为静态链接和外部链接是相互排斥的。还要了解,这两个具有相同名称的不同功能本身不会给您带来任何优势。尽管共享一个名称,但它们具有不同的功能,并且在任何给定的翻译单元中,它们名称的每次出现都将指代同一个。然而,它很容易导致混淆,因为名称将指代不同翻译单元中的不同功能。
给不同的函数起不同的名字会好得多,至少在有外部链接的地方。
关于c - 同名的两个函数 : One static How to declare in header file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26805612/