std :: string vs string

时间:2012-05-04 10:27:31

标签: c++ string namespaces std

我在我的代码中使用了许多名称空间,包括std,所以当我想在我的代码中声明一个字符串变量时,我应该精确地使用std :: 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;
}

6 个答案:

答案 0 :(得分:9)

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

std::boost::之间存在一些名称冲突,特别是对于在标准化之前在Boost中试用的内容。因此,例如,如果您包含相应的标头,则std::shared_ptrboost::shared_ptr都存在。它们可能会也可能不会引用相同的类型,我没有检查Boost是否在定义标准类型之前尝试检测标准类型。

因此,同时使用stdboost命名空间并不一定是个好主意。您可以使用using std::string;的个人名称,而不是整个名称空间。

[*]如果std::string已定义,则不是,因为您未包含<string>

答案 1 :(得分:5)

你可以写string。但是如果boostxerces也有符号string怎么办?我建议不要使用这些using指令。不仅string可能会发生冲突。您实质上是将大量符号拉入全局命名空间。如果你真的想避免输入std::,那么你可以使用typedef:

typedef std::string MyStr;

答案 2 :(得分:4)

如果您使用string,则可以只放using namespace std;

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

答案 3 :(得分:3)

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

答案 4 :(得分:2)

您正在使用命名空间std,因此您无需在string前加std::,但如果需要,可以使用。{/ p>

答案 5 :(得分:0)

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