【问题标题】:Two functions with same name: One static How to declare in header file两个同名函数:一个静态的如何在头文件中声明
【发布时间】:2014-11-07 16:22:55
【问题描述】:

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

有没有办法解决这个问题。我的意思是我想在头文件中提供函数声明,但也需要保持两个函数的名称相同。

【问题讨论】:

  • 在C中,同一作用域内不能有重复的函数签名。
  • 你能解释一下为什么你最终“需要”这个吗?听起来很奇怪。可能有更好的选择。
  • 你期望什么行为?如何区分对外部TestExtern2 的调用和对静态的调用?
  • 如果你需要访问多个源文件中的同一个函数,define其中一个文件中的函数,然后declare函数中的extern另一个。
  • “有办法解决这个问题吗?”是 - 重命名其中一个函数。

标签: c header-files


【解决方案1】:

同一个函数不能在同一个翻译单元中同时声明为静态和非静态。如果您的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 函数来说是一个非常奇怪的名称,因为静态链接和外部链接是互斥的。还要理解,具有相同名称的两个不同功能本身并不会给您带来任何优势。尽管共享一个名称,但它们具有不同的功能,并且在任何给定的翻译单元中,它们名称的每一次出现都将指代同一个。但是,它很容易导致混淆,因为名称将引用不同翻译单元中的不同功能。

最好给不同的函数起不同的名字,至少在一个有外部链接的地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-22
    • 2012-04-05
    • 2010-12-10
    • 1970-01-01
    • 2010-11-03
    • 2020-08-10
    • 2018-11-17
    • 1970-01-01
    相关资源
    最近更新 更多