2016-01-05 64 views
7

我讀memTrack庫從http://www.almostinfinite.com/memtrack.html__FILE__可以通過const char *在C++中引用?

鏈接可以__FILE__被保存在一個變量類型const char*永遠後一個問題,不需要使用strdup()BlockHeader::Stamp是否使用strdup()來指定__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; 
} 

舉一個例子來繼續來形容我的問題:

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

測試後,二進制TESTFILE可以打印 「testFILE.cpp」 的兩行。這只是巧合嗎?

+0

我已經強調了_ **永遠** _因爲它在我看來主要審訊。 – YSC

+0

一個有趣的問題,恭喜 – Dean

回答

9

__FILE__在預處理時被擴展爲字符串。如果你把

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

,那麼它的完全一樣,如果你寫

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

,並適用於所有的字符串文字相同的規則也適用於字符串字面量是不斷擴大的結果__FILE__:它們指向的字符串存在於應用程序的整個運行中。

5

__FILE__擴展爲字符串文字。您可以將一個指向字符串文字(第一個字符)的指針存儲在類型爲char const*的變量中。文字的生命週期與程序執行相同。

0

謝謝大家。我知道了。

C/C++中的字符串文字保存在靜態數據段中,所以文字的生命週期與程序執行相同。

我很困惑字符串文字與局部變量。

再次感謝。