如何在C++中正确使用关键字'using'

  • 本文关键字:关键字 using C++ c++ using
  • 更新时间 :
  • 英文 :


我需要知道我可以在C++中使用"using"关键字的作用域。

假设我们在同一代码库中有两个 CPP 文件,它们使用了具有相同类型名称的 'using' 关键字。

答.cpp

#include <iostream>
namespace space_A
{
typedef struct myStruct
{
int a;
myStruct(): a(1) {}
} MyStruct;
}
using my_type = space_A::MyStruct;
void func_A()
{
my_type *t_a = new my_type();
std::cout<<t_a->a;
}

B.cpp

#include <iostream>
namespace space_B
{
typedef struct myStruct
{
char *b;
myStruct(): b((char*)"xyz") {}
} MyStruct;
}
using my_type = space_B::MyStruct;
void func_B()
{
my_type *t_b = new my_type();
std::cout<<t_b->b;
}

那些"使用my_type = ...."行(实际上是使用点-(func_a,func_b))在这两个文件上? 简单地说,"my_type"是相应文件范围的本地吗?

在提供变量名称和相关标识符的作用域正式定义(例如using关键字引入的别名声明)时,各种C++标准非常冗长(但仍然模糊)。例如,该草案(C++17)标准规定如下:

6.3.1 声明性区域和作用域
1 每个名称都引入程序文本的某个部分,称为声明式 区域,这是该程序的最大部分,其中该名称是 有效,即,该名称可用作非限定名称 以引用同一实体。通常,每个特定名称都是有效的 仅在程序文本的某些可能不连续的部分内称为 其范围。为了确定声明的范围,有时 便于参考声明的潜在范围。范围 声明与其潜在范围相同,除非 潜在范围包含另一个同名声明。在那 案例,声明的潜在范围在内部(包含) 声明性区域被排除在声明的范围之外 外部(包含)声明性区域。

这(至少对我来说)并不是特别翔实,除了这句话:确定声明的范围,有时很方便 指声明的潜在范围。从中可以推断出,如果您不能从"B.cpp"中引用"A.cpp"中给出的my_type定义,那么您可以在该文件中提供另一个(可能不同)这样的定义。

该标准的另一个可能有用的摘录发生在几页之后,在6.3.6 命名空间范围部分下:

L的潜在范围是从其声明点到结束 翻译单位的

此语句也适用于其他声明:每个my_type别名的范围是从每个声明的点到翻译单元(发生该声明的源文件)的末尾。

但是,正如在对您的问题的评论中指出的那样,尽管别名的这种"重复"在C++语言的规则范围内,但这种做法可能会导致以后(在链接阶段)的问题,尤其是在使用链接时代码生成、跨模块运行时链接 (DLL) 和调试器等技术时。

最新更新