在我的代码的一个函数中,我发现了一个错误。它写成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
意味着什么?
答案 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 ;
^
来自铿锵声的类似警告。