2016-01-05 16 views
7

http://www.almostinfinite.com/memtrack.html__FILE__はC++のconst char *で参照できますか?

からリンクされている読み込みmemTrackライブラリは__FILE__タイプconst char*を変数に保存することができます後、私は疑問を持っている永遠strdup()を使用する必要はありませんか? BlockHeader::Stamp 文字列を割り当てるにはstrdup()を使用しないでください。

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" の2行を印刷することができます。それは偶然だけですか?

+0

私は主尋問の様子を見ているので、永遠に** _強調しました。 – YSC

+0

興味深い質問、おめでとうございます – Dean

答えて

9

__FILE__は、前処理時に文字列リテラルに展開されます。あなたは

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

を置く場合、それはあなたが

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

を書いたし、すべての文字列リテラルと同じ規則にも拡大の結果である文字列リテラルには適用されているかのようです __FILE__:それらが指し示す文字列は、アプリケーションの実行全体に存在します。

5

__FILE__は、文字列リテラルに展開されます。文字列リテラルの(最初の文字)へのポインタは、char const*の変数に格納できます。リテラルの存続期間は、プログラムの実行と同じです。

0

ありがとうございます。わかった。

C/C++の文字列リテラルは静的データセグメントに保存されるため、リテラルの有効期間はプログラムの実行と同じです。

文字列リテラルをローカル変数と混同しました。

もう一度おねがいします。

関連する問題