提问人:digito_evo 提问时间:1/31/2023 更新时间:1/31/2023 访问量:103
命名空间函数可以在块范围内声明吗?
Can namespace functions be declared at block scope?
问:
命名空间函数是否可以在定义它们的命名空间之外的块范围内声明?
此代码在定义为以下情况时不编译:DECLARED_IN_NS
1
#define DECLARED_IN_NS 1 // can be either 0 or 1
#if DECLARED_IN_NS == 1
namespace ns
{
#endif
void
func1()
{
}
void
func2()
{
}
#if DECLARED_IN_NS == 1
} // namepace ns
#endif
int main( )
{
#if DECLARED_IN_NS == 1
void ns::func1(); // compile error
void ns::func2(); // compile error
ns::func1();
ns::func2();
#elif DECLARED_IN_NS == 0
void func1();
void func2();
func1();
func2();
#endif
}
它显示了一些错误:
error: qualified-id in declaration before '(' token
28 | void ns::func1();
| ^
代码在全局命名空间中定义时进行编译。但是,当它们在命名空间中定义时,它不会编译(例如 )。func1
func2
ns
有没有办法解决这个问题?
答:
2赞
StoryTeller - Unslander Monica
1/31/2023
#1
我在标准中找不到对此的明确引用,但我认为故意允许它没有多大意义。
即使它可以出现在块范围内,它也毫无意义。使用嵌套名称说明符的声明不能是实体的第一个声明。
[dcl.含义.一般]
1 当声明符 ID 是限定的时,声明应引用限定符所引用的类或命名空间的先前声明的成员(或者,如果是命名空间,则引用该命名空间的内联命名空间集 ([namespace.def])) 的元素)......
这使得这样的代码有效
namespace ns
{
void func();
} // namepace ns
void ns::func(); // repeated declaration - optional
void ns::func() { // definition
}
现在,回到块作用域的情况,无论如何,您都需要在它前面有一个命名空间作用域声明,因此整个练习没有意义。
此外,在块作用域中声明函数的行为具有 c++ 社区恰当地命名的方面,但由于 C 兼容性,它仍然存在。故意允许它用于嵌套名称肯定是没有好处的。
评论
0赞
digito_evo
1/31/2023
它可以帮助使代码在一些特定场景中更不容易出错和更清晰。但是,是的,它总体上并没有那么有用。我将恢复到在命名空间范围内声明。
0赞
StoryTeller - Unslander Monica
1/31/2023
@digito_evo - 我猜你的意思是围绕影子工作?using 声明也可以实现这一点。而且它不需要重复原型。
0赞
digito_evo
2/1/2023
我的意思是它对于仅在单个函数中调用的函数很有用,我们可以在 中本地声明它们,因此确保文件范围内除了这些函数的声明之外,没有其他人可以访问这些函数的声明。这就像隐藏一些不应该被代码的任何其他部分使用的函数。foo()
foo()
foo()
评论
main