std:string和std :: string之间的区别

时间:2015-10-09 12:13:08

标签: c++ visual-c++

在我的代码的一个函数中,我发现了一个错误。它写成std:string

const std::string currentDateTime() {
    time_t     now = time(0);
    struct tm  tstruct;
    char       buf[80];
    tstruct = *localtime(&now);
    //strftime(buf, sizeof(buf), "%Y-%m-%d.%X", &tstruct);
    strftime(buf, sizeof(buf), "%Y%m%d%X", &tstruct);

    std:string str = buf;

    str.erase(std::remove(str.begin(), str.end(), ':'), str.end());
    return str;
}

代码编译没有错误。为什么编译?那么std:string意味着什么?

3 个答案:

答案 0 :(得分:20)

它被解释为可与goto一起使用的标签。

int main()
{
    //label to jump to:
    label_name:
    //some code
    <..>
    //some code
    goto label_name;//jump to the line with the lable
}

显然这是一个错字。您的代码已编译,因为上面某处使用了using namespace std;using std::string。否则你会得到“未在此范围内声明字符串”错误。

答案 1 :(得分:6)

我认为它是编译的,因为上面在文件中使用了臭名昭着的"using namespace std;“指令(或者更糟糕的是,在另一个包含的文件中)。

因此,编译器将“std:”视为goto标签,并使用(std::)string,因为使用了“using namespace std”。

通常在现代编译器上,您可能会收到警告,例如(在gcc中):

  warning: label ‘std’ defined but not used

答案 2 :(得分:5)

std:被用作标签,可用作goto的目标。代码中必须有using directive个位置:

using std::string;

或:

using namespace std; 

另见Why is “using namespace std;” considered bad practice?

这表明使用警告的重要性。我可以使用正确的标志来获取Visual Studio,gcc和clang来警告这一点。对于使用/W3的Visual Studio,会出现以下警告( see it live ):

  

警告C4102:&#39; std&#39; :未引用的标签

对于此代码:

#include <string>

using std::string ;

int main()
{
    std:string s1 ;
}

对于使用-Wall的gcc和clang就足够了,对于gcc我收到以下内容:

warning: label 'std' defined but not used [-Wunused-label]
 std:string s1 ;
 ^
来自铿锵声的类似警告。