【问题标题】:Is it better to declare a function static to make it private or declaring it only on the .c file and excluding it from the header?将函数声明为 static 以使其私有或仅在 .c 文件上声明并将其从标头中排除是否更好?
【发布时间】:2019-06-03 13:02:15
【问题描述】:

我正在用 c 编写一个库,我希望可以从其他 c 文件中调用一些函数,而有些函数我希望保持私有。

我知道可以通过声明 static 来隐藏库文件之外的函数,但同样可以通过仅声明其实现并将其从标题中删除来实现。

比较:

a.h

//static int private_routine();
int sample();


a.c

/*static*/ int private_routine(){

}
int sample(){
  private_routine();
}

哪种做法最好?

【问题讨论】:

  • 如果函数是内部的 - 保持内部。
  • 如果不是静态的,它仍然会发射到对象中,并且可能与同名对象发生冲突。
  • 在标题中声明static 符号是没有意义的。它没有任何好处,只会导致问题。

标签: c static-functions


【解决方案1】:

要将函数“私有”或更好地保留在单个文件的范围内,您需要将它们声明为static。否则,您可以在其他文件中重新声明相同的函数并仍然使用它。

例如:

#include "a.h" // without declaration of private_routine()

/*extern*/ int private_routine(); // by default every declaration behaves as with extern keyword, which means function is defined elsewhere

int main()
{
    private_routine(); // can use here
    return 0;
}

编辑:正如 cmets 中所指出的,如果不声明 static,就不可能在一个应用程序中多次定义具有相同名称的函数。如果你定义一个给定的函数名 N 次,其中至少有 N-1 个必须是 static

【讨论】:

  • extern 在这里是一个红鲱鱼:根据定义,所有函数声明(不是定义)是extern。您只需要显式标记变量声明extern
  • 更糟糕的是,如果多个模块定义了一个“内部”private_routine 而没有声明它static,链接将会失败。
  • @melpomene 除非他们声明inline
  • @KonradRudolph - 不是这样。 inline 定义可能只在翻译单元中可见,但如果它不是 static,它的标识符(例如函数名称)仍然具有外部链接。
  • 那么我不确定你所说的“内联定义完全提供”是什么意思,@KonradRudolph。让我更清楚我在说什么:试图通过将非static 函数声明为inline 来将它们设为私有是不合格的,并且会引发链接错误,除非存在该函数的外部(因此非内联)定义也在程序中的某处。但是 OP 的目标是避免这种情况,所以不,使功能 inline 而不同时使其成为 static 不是一个符合要求的解决方案。 melpomene 是对的,至少在这种情况下是正确的。
猜你喜欢
  • 2017-02-27
  • 1970-01-01
  • 2010-10-13
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 2018-12-29
  • 2022-06-10
  • 2016-09-16
相关资源
最近更新 更多