2016-01-05 7 views
7

Ich habe eine Frage nach__FILE__ kann durch const char * in C++ bezeichnet werden?

von http://www.almostinfinite.com/memtrack.html verknüpft memTrack Bibliothek zu lesen Kann __FILE__ mit Typ const char*immer in einer Variablen gespeichert werden und muß nicht strdup() benutzen? Verwendet BlockHeader::Stamp nicht strdup(), um die __FILE__ Zeichenfolge zuzuweisen?


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

ein Beispiel geben, meine Frage weiter zu beschreiben:

//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; 
    } 

nach dem Test, der binäre testdat zwei Zeilen "testFILE.cpp" drucken. Ist es nur Zufall?

+0

Ich habe das _ ** für immer ** _ betont, wie es mir die Hauptvernehmung aussieht. – YSC

+0

Eine interessante Frage, herzlichen Glückwunsch – Dean

Antwort

9

__FILE__ wird zur Vorverarbeitungszeit auf ein Zeichenfolgenliteral erweitert. Wenn Sie

setzen
const char* getStr() 
{ 
    return __FILE__; 
} 

in testFILE.cpp, dann ist es genau so, wie wenn Sie

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

und die gleichen Regeln, die auch für Stringliterale gelten für alle Zeichenketten anwenden, die das Ergebnis der Erweiterung sind __FILE__: Die Zeichenfolgen, auf die sie verweisen, sind für den gesamten Anwendungslauf vorhanden.

5

__FILE__ expandiert zu einem String-Literal. Sie können einen Zeiger auf (das erste Zeichen) eines Zeichenfolgenliterals in einer Variablen vom Typ char const* speichern. Die Lebensdauer des Literals entspricht der Ausführung des Programms.

0

Vielen Dank. Ich hab es geschafft.

Das Zeichenfolgenliteral in C/C++ wird im statischen Datensegment gespeichert, so dass die Lebensdauer des Literals der Programmausführung entspricht.

Ich war verwirrt das String-Literal mit lokalen Variablen.

Nochmals vielen Dank.

Verwandte Themen