2015-10-09 27 views
21

In einer Funktion meines Codes habe ich einen Fehler gefunden. Es wurde std:string geschrieben:Unterschied zwischen Std: String und 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; 
} 

Der Code kompiliert ohne Fehler. Warum kompiliert es? Was bedeutet std:string dann?

+9

'std:' ist ein Etikett, dort muss irgendwo ein Einsatz sein. –

+2

Dieser Code funktioniert nur, wenn Sie "namespace std" verwenden, was sowieso IMO schlecht ist. Andernfalls wäre dies als Kompilierfehler aufgefunden worden, sofern nicht irgendwo eine Typzeichenfolge definiert ist. – Devolus

+2

@Devolus Sie können auch mit std :: string arbeiten, um denselben Effekt zu erhalten. – dascandy

Antwort

20

Es wird als ein Label interpretiert, das mit Goto verwendet werden kann.

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

Offensichtlich war das ein Tippfehler. Ihr Code wurde kompiliert, weil using namespace std; oder using std::string irgendwo oben verwendet wurde. Andernfalls würden Sie eine Fehlermeldung erhalten, dass der String nicht in diesem Bereich deklariert wurde.

6

Ich denke, es kompiliert, da die berüchtigte "using namespace std; „Richtlinie über in der Datei verwendet wurde (oder noch schlimmer, in einer anderen Datei enthielt).

So ist der Compiler sieht“ std: "als goto Label und verwende (std::)string weil "using namespace std" verwendet wurde

Normalerweise auf moderne Compiler eine Warnung haben, so etwas wie (in gcc).

warning: label ‘std’ defined but not used 
+1

Es gibt ein paar Probleme mit dieser Antwort,' namespace std; 'ist nicht die einzige Möglichkeit, dies zu tun und obwohl es wahr ist gcc kann warnen Sie dafür, dass das OP die Frage mit Visual C++ versehen hat und die Warnung nicht automatisch ist, müssen Sie sie einschalten. Wenn sie automatisch wären, hätte das OP das Problem entdeckt und niemals die Frage gestellt. Die Ursache des Problems besteht also nicht darin, dass Warnungen aktiviert sind. –

5

std: ist u sein sed als ein Etikett, das als Ziel einer goto verwendet werden kann. Es muss eine using directive irgendwo im Code entweder:

using std::string; 

oder:

using namespace std; 

Auch Why is “using namespace std;” considered bad practice? sehen.

Dies zeigt die Bedeutung der Verwendung von Warnungen. Ich kann Visual Studio, gcc und clang dazu bringen, dafür mit den richtigen Flags zu warnen. Für Visual Studio /W3 gibt die folgende Warnung (see it live):

Warnung C4102: 'std': unreferenced Label

Für diesen Code:

#include <string> 

using std::string ; 

int main() 
{ 
    std:string s1 ; 
} 

für gcc und clang mit -Wall war ausreichend, für gcc bekomme ich folgendes:

warning: label 'std' defined but not used [-Wunused-label] 
std:string s1 ; 
^ 

und eine ähnliche Warnung von Clang.

Verwandte Themen