0

我在我的代码中使用了许多命名空间,包括 std one ,所以当我想在我的代码中声明一个字符串变量时,我应该精确 std::string 还是我可以只放 string :

#include <string.h> 

using namespace std;
using namespace boost;
using namespace xerces;

int main()
{
    /*! should I declare my str like this */
    std::string str;
    /*! or I can declare it like this */
    string str1;
    cout << str << str1 <<endl;
    return 0;
}
4

6 回答 6

9

由于您有using namespace std;,因此名称的string含义与std::string[*] 相同。因此,这是您喜欢的风格问题(如果您喜欢,std::string则可以省略using namespace std;)。

std::和之间存在一些名称冲突boost::,特别是对于标准化之前在 Boost 中试验的东西。因此,例如,如果您包含适当的标题,那么两者都std::shared_ptr存在boost::shared_ptr。它们可能会或可能不会引用相同的类型,我没有检查 Boost 在定义自己的类型之前是否尝试检测标准类型。

std因此,同时使用和命名空间不一定是一个好主意boost。您可以将单个名称与using std::string;, 而不是整个命名空间一起使用。

[*] ifstd::string已定义,但未定义,因为您没有包含<string>.

于 2012-05-04T10:33:34.900 回答
5

你可以只写string。但是如果boost或者xerces也有一个符号string呢?我建议不要使用这些using指令。不仅string如此,可能会发生冲突。您实际上是将大量符号拉入全局命名空间。如果你真的想避免打字std::,那么你可以使用 typedef:

typedef std::string MyStr;
于 2012-05-04T10:34:44.033 回答
4

你可以放只要string你使用using namespace std;.

在所有情况下添加using namespace std;可能不是最好的主意,因为在某些情况下它可能会导致命名空间之间的冲突(尽管不太可能string)。

于 2012-05-04T10:28:27.993 回答
3

通常不需要指定std::string是否已将using namespace std; BUT声明为一般情况,如果有多个名称空间包含具有相同名称的不同类,那么namespace::type无论是否存在using声明。

于 2012-05-04T10:32:09.243 回答
2

您正在使用命名空间std,因此您不需要添加前缀stringstd::但如果您愿意,可以添加。

于 2012-05-04T10:28:49.327 回答
0

编码的一个好方法是不要在标头中使用任何相关的命名空间,以防止在#include 时将命名空间暴露在外部。但是在编译后的源代码中,你可以做任何你想做的事情,甚至使用 std 命名空间并调用 std::string。有时甚至需要它(如果您包含定义相同字符串类的两个命名空间)。

于 2012-05-04T10:49:27.570 回答