【问题标题】:Class methods internal linkage类方法内部链接
【发布时间】:2020-03-05 22:51:41
【问题描述】:

在 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 仍将与外部链接。有没有办法让它内部保留它在结构中?

【问题讨论】:

  • 不,没有。 C++ 不能以这种方式工作。没有什么能阻止你在翻译单元中声明静态函数,比如 C,但它不会是类方法。
  • @Sam 为什么不将其发布为答案?

标签: c++ c linker translation-unit


【解决方案1】:

您可以在 C++ 中声明普通静态函数,就像在 C 中一样,在任何翻译单元中。但它们将是普通的静态函数,而不是类方法。

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

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

【讨论】:

    猜你喜欢
    • 2015-08-11
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2015-06-19
    • 2014-08-13
    相关资源
    最近更新 更多