2016-01-05 8 views
7

Ho una domanda dopo aver letto biblioteca memTrack collegato da http://www.almostinfinite.com/memtrack.html__File__ può essere indirizzato da const char * in C++?

Può __FILE__ essere salvato in una variabile di tipo const char*sempre e non hanno bisogno di usare strdup()? BlockHeader::Stamp non utilizza strdup() per assegnare la stringa __FILE__?


void BlockHeader::Stamp(char const *filename, int lineNum, char const *typeName) 
{ 
    myFilename = filename; // don't use strdup(filename) to assign? 
    myLineNum = lineNum; 
    myTypeName = typeName; 
} 

dare un esempio di continuare a descrivere la mia domanda:

//testFILE.cpp 
    #include <iostream> 

    const char* getStr() 
    { 
     return __FILE__; 
    } 

    void Print() 
    { 
     std::cout << __FILE__ << std::endl; 
    } 

    int main() 
    { 
     std::cout << getStr() << std::endl; 
     Print(); 

     return 0; 
    } 

dopo il test, il testfile binario può stampare due linee di "testFILE.cpp". È solo una coincidenza?

+0

Ho sottolineato il _ ** per sempre ** _ come mi sembra l'interrogatorio principale. – YSC

+0

Una domanda interessante, congratulazioni – Dean

risposta

9

__FILE__ viene espanso a una stringa letterale in fase di preelaborazione. Se si mette

const char* getStr() 
{ 
    return __FILE__; 
} 

in testFILE.cpp, allora è esattamente come se avessi scritto

const char* getStr() 
{ 
    return "testFILE.cpp"; 
} 

e le stesse regole che si applicano a tutte le stringhe letterali applicare anche a stringhe letterali che sono il risultato di espansione __FILE__: le stringhe che indicano esistano per l'intera esecuzione dell'applicazione.

5

__FILE__ si espande in una stringa letterale. È possibile memorizzare un puntatore a (il primo carattere) di una stringa letterale in una variabile di tipo char const*. La durata letterale è la stessa dell'esecuzione del programma.

0

Grazie a tutti. Capito.

La stringa letterale in C/C++ viene salvata nel segmento di dati statici, quindi la durata letterale è la stessa dell'esecuzione del programma.

Sono stato confuso la stringa letterale con la variabile locale.

Grazie ancora.