§7.3.1.2/ 1
成员(包括模板的明确专业化(14.7.3)) 可以在该命名空间中定义命名空间。 [例如:
namespace X { void f() { / ... / } }
为了在命名空间中定义函数,您必须使用其中一个说明符:static
或inline
。我是对的吗?
答案 0 :(得分:4)
没有。您可以在具有非内联外部链接的命名空间中定义它,只要程序中只有一个定义(以满足一个定义规则的要求)。
通常,这意味着您可以在源文件中定义它(因此它只在一个翻译单元中定义一次),但必须声明它inline
(或可能{{} 1}},或在未命名的命名空间中,在异常情况下)如果您在标题中定义它,可能包含在多个翻译单元中。但这与定义是否在其命名空间内无关。
答案 1 :(得分:3)
你可以想象你有一个带声明的头文件:
namespace X {
void f();
}
翻译单元,包括此标题,包含以下内容:
namespace X {
void f() { / ... / }
}
作为替代:
void X::f() { / ... / }
或者包含与X::f
无关的任何内容的翻译单元,它们都声明并定义了该函数:
namespace X {
void f() { / ... / }
}
答案 2 :(得分:2)
即使没有标题,您也可以使用包含以下内容的.cpp文件:
namespace X {
void f() { / ... / }
}
如果它仅包含在一个翻译单元中,您可以将其添加到标题中
此外,即使标题包含在多个翻译单元中,它也可以是这样的:
namespace {
namespace X {
void f() { / ... / }
}
}