Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';“的范围是什么?”;使用;C+中的声明+;? 我使用C++中的“使用”声明来添加STD::String和STD::vector到本地命名空间(以保存不必要的“STD:::\”)。_C++ - Fatal编程技术网

什么';“的范围是什么?”;使用;C+中的声明+;? 我使用C++中的“使用”声明来添加STD::String和STD::vector到本地命名空间(以保存不必要的“STD:::\”)。

什么';“的范围是什么?”;使用;C+中的声明+;? 我使用C++中的“使用”声明来添加STD::String和STD::vector到本地命名空间(以保存不必要的“STD:::\”)。,c++,C++,这个声明的范围是什么?如果我在标题中这样做,它会将这些“使用”声明注入到包含标题的每个cpp文件中吗?在所引用的案例中,是文件(“翻译单元”),意思是“是”,包含标题的每个文件 您还可以将using语句放在类中,在这种情况下,它只对该类有效 通常,如果需要在头中指定名称空间,通常最好只完全限定每个必要的标识符 没错。作用域是使用using声明的模块。如果模块中包含的任何头文件都使用声明,则这些声明的范围将是该模块,以及包含相同标题的任何其他模块。 < P>当您在C++中包含头文件时,它将头文件的

这个声明的范围是什么?如果我在标题中这样做,它会将这些“使用”声明注入到包含标题的每个cpp文件中吗?

在所引用的案例中,是文件(“翻译单元”),意思是“是”,包含标题的每个文件

您还可以将using语句放在类中,在这种情况下,它只对该类有效


通常,如果需要在头中指定名称空间,通常最好只完全限定每个必要的标识符

没错。作用域是使用
using
声明的模块。如果模块中包含的任何头文件都使用声明,则这些声明的范围将是该模块,以及包含相同标题的任何其他模块。

< P>当您在C++中包含头文件时,它将头文件的全部内容放入源文件中包含的位置。因此,包含一个带有
using
声明的文件,其效果与将
using
声明放在包含该头文件的每个文件的顶部完全相同。

头文件没有什么特殊之处,可以保留
using
声明。在编译开始之前,它只是一个简单的文本替换

您可以使用声明将
限制为一个范围:

void myFunction()
{
   using namespace std; // only applies to the function's scope
   vector<int> myVector;
}
void myFunction()
{
使用命名空间std;//仅适用于函数的作用域
向量myVector;
}

范围是使用声明所在的任何范围

如果这是全局范围,那么它将位于全局范围。如果它位于头文件的全局范围内,则它将位于包含头文件的每个源文件的全局范围内


因此,一般建议是避免在头文件的全局范围内使用声明

using语句的范围取决于它在代码中的位置:

  • 它位于文件的顶部,在整个文件中都有作用域
  • 如果这是一个头文件,它将在包含该头文件的所有文件中具有作用域。一般来说,这“不是一个好主意”,因为它可能会产生意想不到的副作用
  • 否则,using语句的作用域在包含它的块中,从它出现的点到块的末尾。如果它被放置在一个方法中,它将在该方法中具有作用域。如果它被放置在类定义中,它将在该类中具有作用域

    • 有一些评论在说“不要”时是相当无保留的。这太严厉了,但你必须明白什么时候可以

      使用std::string编写
      永远都不好。在您自己的头中使用ImplementationDetail::Foo编写
      ,当该头声明ImplementationDetail::Foo时就可以了,如果使用声明发生在您的命名空间中,则更是如此。例如

      namespace MyNS {
          namespace ImplementationDetail {
              int Foo;
          }
          using ImplementationDetail::Foo;
      }
      


      那还不够强壮。用“不”取代“避免”,但“避免”比“不”强。“避免撞到其他车”。。。这通常是一件坏事。但是如果您将
      using
      声明放在
      名称空间中,则它仅限于该名称空间的范围,因此通常是可以的(通常针对您的特定需求和样式提出警告)…但是如果您将using放在名称空间中,确保您这样做不是为了绕过通常是个坏主意的东西,比如您不能将在命名空间Y之外声明的类方法封装到另一个命名空间X中,这样您就可以在本地使用命名空间X。这就是为什么我们首先要使用namespace::Resolver。如果键入的问题那么大,无论是宏(很容易导致代码气味)还是更好,请将其隔离到它自己的source.cpp中,在那里您将只使用名称空间。虽然这和类似的答案都是很好的建议,他们没有回答这个问题。然后标题的用户可以编写
      MyNS::Foo
      一个更好的例子是
      使用boost::posix_time::ptime
      。当然,用户可以编写
      MyNS::ptime
      ,但这还不是世界末日,而且可能会被能够拥有
      MyFunction(ptime a,ptime b)
      之类的函数的便利性所抵消。为什么
      使用std::string
      永远都不行?即使在您自己的名称空间中也可以保存大量的
      std::
      前缀?@thomtom将其包装在您自己的名称空间这样的范围内也可以。以防其他答案不清楚:-不要将
      using
      声明(或
      using
      指令)放在include文件/头的文件范围内!这将给头的用户带来麻烦。事实上,不要在头中使用
      声明(fortiori指令),即使是在名称空间中!看看这会导致什么问题。@NilsvonBarth:这有点过于简单了。关于所讨论的问题,在类和函数范围内使用
      是安全的。您可能有兴趣了解该功能。请注意,在类中使用
      声明与在类外声明的行为方式不同-例如,您不能使用它将
      cout
      而不是
      std::cout
      带入类。我认为在类范围内使用
      语句添加
      是不可能的?因为我想避免到处输入
      std::
      ,所以我的问题与OP相同。我得到的类使用了很多带有智能指针的向量,并且五个字符的
      std::
      前缀增加了很多行长度,我发现读起来更糟。所以我想知道在包含类的名称空间中使用
      指令是否可以?(即使在头中。)如果它被放置在
      名称空间{…}
      的范围内呢?这样您就可以完全编写:{using}
      namespace MyNS {
          namespace ImplementationDetail {
              int Foo;
          }
          using ImplementationDetail::Foo;
      }