c - 同名的两个函数 : One static How to declare in header file

标签 c header-files

我有两个 .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/

相关文章:

c - SDL2/C 中放慢矩形速度

C- 通过二次拟合检测峰值

c++ - 在哪里/如何将函数放在头文件与 C++ 源文件中

c - 如何修复 "implicit declaration of function"

c++ - 先转发声明还是先#include?

c - 将 srand() 放在头文件中是个好主意吗?

C 链表 valgrind 大小读取无效

c - 为什么这个版本的 C 中的逻辑与不显示短路行为?

c - 在 C 中使用套接字的 HTTP 请求

doxygen - 如何排除私有(private) header 出现在源浏览器中?