提问人:YoonSeok OH 提问时间:5/1/2023 最后编辑:YoonSeok OH 更新时间:5/2/2023 访问量:150
在 C++17 文档中哪里说类静态成员函数具有外部链接?
Where in C++17 document say that class static member function has external linkage?
问:
我看过一些关于静态成员函数具有外部链接的说法。
但是,我无法从 C++17 官方文档中找到该声明。有人知道吗?
如果有人提供 c++17 文档或任何其他版本中的行,说明静态成员函数具有外部链接,将不胜感激。
[编辑]
也许问题无法回答,因为它取决于情况。我不明白和想了解的是如何识别哪个有内部或外部联系。
“取决于情况”的意思是这样的,
“此外,成员函数、静态数据成员、命名类或类范围的枚举,或者 在类范围 TypeDef 声明中定义的未命名类或枚举,使得类或枚举 具有用于链接目的的 typedef 名称 (10.1.3),具有与 它是会员。(ISO N4659 6.5.5)”
它没有提到静态成员“函数”。所以我不确定它是否适用。
这是示例案例。
[示例1]
啊
class A
{
public:
A();
~A();
};
.cpp
#include "A.h"
A::A()
{
}
A::~A()
{
}
A类具有外部链接,因为它属于
- 命名空间 (global),它不是未命名的命名空间。
- “所有其他命名空间都有外部链接”(ISO N4659 6.5.4)
例如,只要包含标头,构造函数对不同的 cpps 是“可见的”,表明它是外部链接,即“它所表示的实体可以通过 其他翻译单元或来自同一翻译单元的其他范围“(ISO N4659 6.5.2.1)。
[示例2]
啊
#pragma once
class A
{
public:
static void Foo()
{
}
A(){}
~A(){}
};
B.h
#pragma once
class B
{
public:
void Bar();
B();
~B();
};
B.cpp
#include "B.h"
#include "A.h"
void B::Bar()
{
A::Foo();
}
B::B()
{
}
B::~B()
{
}
C.h.(英语:C.h)
#pragma once
class C
{
public:
void Bar();
C();
~C();
};
C.cpp
#include "C.h"
#include "A.h"
void C::Bar()
{
A::Foo();
}
C::C()
{
}
C::~C()
{
}
main.cpp
#include <iostream>
#include "B.h"
#include "C.h"
int main()
{
B b;
C c;
b.Bar();
c.Bar();
return 0;
}
由于示例 1 中相同的原因,A 类具有外部链接。 A 中的静态成员函数 Foo 具有外部链接,因为
"命名空间范围内类的成员函数具有 该类的链接。局部类 (12.4) 的成员函数没有关联。(ISO N4659 12.2.1.2)
在此语句中,它没有明确提到“静态”成员函数属于此“成员函数”。
简而言之,从示例 2 中,
- A类具有外部链接,因为
“所有其他命名空间都有外部链接”(ISO N4659 6.5.4)
- static void Foo 具有外部链接,因为
“此外,成员函数、静态数据成员、类作用域的命名类或枚举,或类作用域 typedef 声明中定义的未命名类或枚举,使得该类或枚举具有用于链接目的的 typedef 名称 (10.1.3),具有与其所属类的名称相同的链接(如果有的话)。(ISO N4659 6.5.5)”
“命名空间范围内类的成员函数具有该类的链接。局部类 (12.4) 的成员函数没有关联。(ISO N4659 12.2.1.2)
我理解正确吗?
答:
C++17 标准的措辞可在 [basic.link]/5 中找到:
此外,成员函数、静态数据成员、命名类或类范围的枚举,或者 在类范围 TypeDef 声明中定义的未命名类或枚举,使得类或枚举 具有用于链接目的的 typedef 名称 (10.1.3),具有与 它是会员。
静态成员函数是成员函数,因此如果类名具有外部链接,则类的静态成员函数的名称也具有外部链接。但是类名也可以有内部链接或没有链接(在 C++20 中,它们也可以有模块链接)。
评论