2015-10-09 21 views
21

In una funzione del mio codice ho trovato un bug. E 'stato scritto std:string:Differenza tra std: string e 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; 
} 

il codice viene compilato senza errori. Perché viene compilato? Cosa significa allora std:string?

+9

'std:' è un'etichetta, ci deve essere un utilizzo in là da qualche parte. –

+2

Questo codice funziona solo se stai facendo "using namespace std" che comunque è IMO male. Altrimenti questo sarebbe stato catturato come errore di compilazione a meno che non ci sia una stringa di testo definita da qualche parte. – Devolus

+2

@Devolus Puoi anche usare std :: string, per ottenere lo stesso effetto. – dascandy

risposta

20

Viene interpretato come un'etichetta che può essere utilizzata con goto.

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

Ovviamente quello era un errore di battitura. Il tuo codice compilato perché using namespace std; o using std::string è stato utilizzato da qualche parte sopra. Altrimenti si otterrebbe un errore "stringa non dichiarata in questo ambito".

6

penso che compila perché il famigerato "using namespace std; "direttiva è stata utilizzata in precedenza nel file (o peggio, in un altro inclusi file).

Così il compilatore vede" std: "come etichetta goto, e usa (std::)string perché "using namespace std" è stato usato

Normalmente il compilatore moderno si può avere un avvertimento, qualcosa di simile (in gcc):.

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

Ci sono un paio di problemi con questa risposta,' using namespace std; 'non è l'unico modo per farlo e anche se è vero gcc can avvisare per questo l'OP ha taggato la domanda Visual C++ e l'avviso non è automatico è necessario attivarli. Se fossero automatici, l'OP avrebbe scoperto il problema e non avrebbe mai posto la domanda. Quindi la radice del problema non sta attivando gli avvisi. –

5

std: è essere u sed come un'etichetta che può essere utilizzata come target di un goto. Ci deve essere una qualche parte using directive né del proprio codice:

using std::string; 

o:

using namespace std; 

vedere anche Why is “using namespace std;” considered bad practice?.

Ciò dimostra l'importanza dell'utilizzo degli avvisi . Posso ottenere Visual Studio, gcc e clang per avvisare per questo utilizzando i flag corretti. Per Visual Studio utilizzando /W3 ha pronunciato la seguente avvertenza (see it live):

avvertimento C4102: 'std': l'etichetta senza riferimenti

Per questo codice:

#include <string> 

using std::string ; 

int main() 
{ 
    std:string s1 ; 
} 

per gcc e clang usando -Wall era sufficiente, per gcc ricevo il seguente:

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

e un avviso simile da clang.

Problemi correlati