C++ 字符串vs字符串
我在代码中使用了许多名称空间,包括std名称空间,因此,当我想在代码中声明字符串变量时,我应该使用精确的std::string还是只需放置string:C++ 字符串vs字符串,c++,string,namespaces,std,C++,String,Namespaces,Std,我在代码中使用了许多名称空间,包括std名称空间,因此,当我想在代码中声明字符串变量时,我应该使用精确的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 st
#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;
}
#包括
使用名称空间std;
使用名称空间boost;
使用名称空间xerces;
int main()
{
/*!我应该这样申报我的str吗*/
std::字符串str;
/*!或者我可以这样申报*/
字符串str1;
cout如果使用使用名称空间std;
,则可以只放置字符串
在所有情况下,使用namespace std;
添加可能不是最好的主意,因为在某些情况下,它可能会导致名称空间之间的冲突(尽管对字符串
不加键).您使用的是命名空间std
,因此不需要在string
前面加上std:
,但是如果您愿意,您可以这样做。通常,如果您声明使用命名空间std;
则无需指定std::string
,但作为一般情况,如果有多个命名空间ich包含具有相同名称的不同类,那么您必须指定类型旁边的名称空间(名称空间::类型
),而不管是否存在使用
语句的。由于您使用了名称空间std;
,因此名称字符串
的含义与std::字符串
[*]因此,这是一个您更喜欢哪种样式的问题(如果您更喜欢std::string
,则可以省略使用名称空间std;
)
std:
和boost:
之间有一些名称冲突,特别是对于标准化之前在boost中试用过的东西。因此,例如,如果您包含适当的标题,那么std::shared_ptr
和boost::shared_ptr
都存在。它们可能指同一类型,也可能指不指't检查Boost在定义自己的标准类型之前是否尝试检测标准类型
因此,同时使用std
和boost
名称空间并不一定是个好主意。您可以将单个名称与一起使用std::string;
,而不是整个名称空间
[*]如果定义了std::string
,但它没有定义,因为您没有包含
,您可以只编写string
。但是如果boost
或xerces
也有一个符号string
,我建议不要使用指令来使用这些。这不仅仅是string
冲突。实际上,您正在将大量符号拉入全局名称空间。如果确实希望避免键入std::
,则可以使用typedef:
typedef std::string MyStr;
编写代码的一个好方法是不要在头中使用任何相关的名称空间,以防止在#include时将名称空间暴露在外部。但是在编译的源代码中,您可以做任何您想做的事情,甚至可以使用std名称空间并调用std::string。有时甚至需要它(如果您包含两个定义相同字符串类的名称空间).这就是使用的目的:)\include
不会给您带来std::string
declaration@Glolita:StackOverflow不会给你一个明确的“是/否”回答一个与风格有关的问题。@juergend:No。这就是使用
被滥用的原因。或者更糟的是:如果你键入strong
,意思是键入std::string
,并且有一个boost::strong
?@R.martinhofernande的优点。或者如果你有一个模板化的set
函数,就像我最近看到的一个问题那样,该怎么办好的,我已经知道了,但是如果我的代码中需要两个来自两个不同名称空间的具有相同名称的类(当然不是相同的实现,假设我的代码是一个交换类或类似的东西),该怎么办因此,我需要在调用类之前精确名称空间名称,但一旦这样做了,我就不应该继续这样做,即使在其他使用的名称空间中没有类似名称的类也是如此吗?@Glolita:这完全取决于你(或者你的老板,如果你的老板写了你的风格指南的话)。仅因为某些名称不明确,因此需要名称空间前缀,并不意味着您必须在每个名称上都写入名称空间前缀。如果您要写入字符串
,并且它不会与字符串
的任何其他定义冲突,则首先使用名称空间std;
或使用std::string代码>。我更喜欢使用std::string;
,因为我不喜欢导入一个很长的名称列表,其中一些名称我从未听说过,在未来的编译器版本中可能会发生变化。