【问题标题】:How to use 'using' keyword properly in C++如何在 C++ 中正确使用“using”关键字
【发布时间】:2020-08-21 15:12:34
【问题描述】:

我需要知道我可以在 C++ 中使用 'using' 关键字的范围。

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

A.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;
}

这两个文件上的那些“using my_type = ....”行(实际上是针对使用点-(func_a, func_b))会不会有冲突? 简单地说,'my_type' 是各自文件范围的本地吗?

【问题讨论】:

  • typedef struct myStruct -- 在 C++ 中,typedef struct 不是必需的。只需 struct myStruct 即可。
  • 好的,但我在这里关注的是“使用 my_type=..”。例如:A.cpp 中的“my_type”能否在 B.cpp 的 func_B 中可见?
  • 不,仅当 using 在头文件中时。在不同的cpp 文件上你是安全的。如果您不确定这样的问题,您可以随时将其写在您的代码中并检查您是否遇到任何错误。
  • @רועיאבידן 这通常是一种很好的做法,但编译器可能无法诊断诸如 ODR 违规之类的事情,这在这种情况下是可能的。
  • 我们可以使用 'static' 关键字来声明文件本地的函数(在 C 中)。我需要这种“使用 my_type =....”的行为(如果我在文件 A.cpp 中使用 my_type,那么 my_type 必须是 A.cpp 的那个)。现在这些文件中是否存在这种行为?

标签: c++ using


【解决方案1】:

各种 C++ 标准在提供变量名和相关标识符的范围正式定义和相关标识符(例如using 关键字引入的 em>alias-declaration)。例如,this Draft (C++17) Standard 表示以下内容:

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

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

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

l 的潜在范围是从它的声明点到结尾 翻译单位的

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

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

【讨论】:

  • 我们可以使用 'static' 关键字来声明文件本地的函数(在 C 中)。我需要这种“使用 my_type =....”的行为(如果我在文件 A.cpp 中使用 my_type,那么 my_type 必须是 A.cpp 的那个)。现在这些文件中是否存在这种行为?
  • @yasaramalshan 是的。根据 C++ 标准,您的两个源文件中的每一个 能够使用 that 文件中定义的 my_type 别名。每个源文件都是一个独立的翻译单元,并且不能知道在这些文件之外定义或声明的东西(显然除了包含在头文件中)。
猜你喜欢
  • 2010-10-04
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
相关资源
最近更新 更多