提问人:user2023370 提问时间:7/28/2023 更新时间:7/28/2023 访问量:58
静态类成员函数的外部链接还是内部链接?
External or internal linkage for static class member functions?
问:
我相信声明为 C++ 成员函数具有内部链接。当我将 libbar.cpp/libbar.hpp(如下)编译为共享对象时,我发现我可以同时调用两者并从单独的(主)程序调用。为什么静态成员函数在其转换单元之外可用?static
test1
test2
test2
// bar/libbar.hpp
struct Foo
{
void test1();
static void test2();
};
// bar/libbar.cpp
#include <iostream>
void Bar::test1() { std::cout << __PRETTY_FUNCTION__; }
void Bar::test2() { std::cout << __PRETTY_FUNCTION__; }
我使用 和 程序(如下)编译共享对象。我在 Debian 上使用 GCC 和 Clang。$CXX libbar.cpp -shared -fpic -o libbar.so
main
$CXX -I bar -L bar main.cpp -Wl,-rpath,$PWD/bar -lbar
// main.cpp
#include "libbar.hpp"
int main(int argc, char *argv[])
{
Bar b{};
b.test1();
b.test2();
return 0;
}
答:
5赞
chrysante
7/28/2023
#1
关键字在不同的上下文中具有不同的含义。static
- 在文件范围和命名空间范围,它表示声明为具有内部链接的函数或变量。
static
- 在类范围内,这意味着函数或数据成员不与该类的对象相关联。这意味着您可以像这样调用该函数: .
test2
Foo::test2()
- 在函数作用域,这意味着声明的变量与函数的当前调用无关,并且只会初始化一次。以下函数在第 N 次调用时将始终返回数字 N。
static
int counter() {
static int count = 0;
return ++count;
}
关于具有内部链接的成员函数:
在 C++ 中,与 C 相反,类型也具有链接。类的成员函数与类本身具有相同的链接。因此,要使成员函数具有内部链接,您必须在匿名命名空间中声明该类:
namespace {
class Foo {
void test();
};
void Foo::test() { /* ... */ }
}
现在,该类具有内部链接,因此也具有内部链接,并且在翻译单元之外不可用。Foo
Foo::test()
评论
0赞
user2023370
7/28/2023
谢谢。我认为静态数据成员也是如此。
1赞
chrysante
7/28/2023
@user2023370 是的,这同样适用于数据成员。
下一个:C++ 作为 FFI 语言
评论
static