我看过一些说法静态成员函数有外部链接.
但是,我找不到C++17官方文档中的声明。有谁知道吗?
如果有人提供来自 c++17 文档或声明静态成员函数具有外部链接的任何其他版本的行,将不胜感激。
[编辑]
也许问题无法回答,因为这取决于情况。我不明白和想明白的是如何识别内部或外部链接。
“视情况而定”的意思是,
“此外,成员函数、静态数据成员、命名类或类作用域的枚举,或一个 在类范围 typedef 声明中定义的未命名类或枚举,这样类或枚举 具有用于链接目的的 typedef 名称 (10.1.3),具有相同的链接,如果有的话,作为类的名称 它是成员。 (ISO N4659 6.5.5)"
它没有提到静态成员“功能”。所以我不确定它是否适用。
这是案例。
【例一】
A.h
class A
{
public:
A();
~A();
};
A.cpp
#include "A.h"
A::A()
{
}
A::~A()
{
}
A类有外部链接,因为它属于
例如 A 构造函数对不同的 cpps 是“可见的”,只要包含标头就表明它是外部链接,即“它表示的实体 可以通过范围内的名称引用 其他翻译单位或来自同一翻译单位的其他范围”(ISO N4659 6.5.2.1)。
【例2】
A.h
#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
#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;
}
A 类在示例 1 中出于相同原因具有外部链接。 A 中的静态成员函数 Foo 具有外部链接,因为
"命名空间范围内的类的成员函数具有 该类的链接。本地类 (12.4) 的成员函数没有链接。”(ISO N4659 12.2.1.2)
在这个声明中没有明确提到“静态”成员函数属于这个“成员函数”。
简而言之,从例子2,
“所有其他命名空间都有外部链接”(ISO N4659 6.5.4)
“此外,成员函数、静态数据成员、命名类或类作用域的枚举,或者在类作用域 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 中,它们也可以有模块链接)。