类方法内部链接

时间:2019-11-09 16:26:25

标签: c++ c linker translation-unit

在C语言中,我可以在头文件中声明一个结构和一些公共函数,而在源文件中可以将某些“私有”函数声明为静态。例如:

foo.h

typedef struct Foo {
...
} Foo;
void func1(Foo *foo);

foo.c

#include "foo.h"
static void func2(Foo *foo) {...}
void func1(Foo *foo) {...}

在这种情况下,func2是内部链接的。 C ++类方法有可能吗?如果我写:

foo.hpp

struct Foo {:
  void func1();
private:
  void func2();
};

func2仍将在外部链接。有没有办法使它内部保留在结构中?

1 个答案:

答案 0 :(得分:0)

您可以在C ++中以任何转换单元的形式在C ++中声明普通的静态函数。但是它们将是普通的静态函数,而不是类方法。

类的方法不限于单个翻译单元。对于具有许多方法的大型类来说,将其分解为两个或更多不同的翻译单元并不少见。当然,来自一个翻译单元的私有方法当然可以按顺序翻译单元调用其他私有方法。因此,它们的链接必须是外部的。

这就是标准C ++给您的全部。除此之外,如果不考虑可移植性,则可以使用特定于实现的扩展。例如,gcc提供了the visibility attribute。 “内部”可见性似乎暗示静态链接。我尚未验证,但是该属性也被指出适用于C ++代码,而不仅仅是C。