__FILE__可以用C ++中的const char *引用吗?

时间:2016-01-05 16:41:24

标签: c++ macros

在阅读从http://www.almostinfinite.com/memtrack.html

链接的memTrack库后,我有一个问题

可以将__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”。这只是巧合吗?

3 个答案:

答案 0 :(得分:10)

__FILE__在预处理时扩展为字符串文字。如果你把

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

,然后它就像你写的那样

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

和适用于所有字符串文字的相同规则也适用于扩展__FILE__的结果的字符串文字:它们指向的字符串存在于整个应用程序运行中。

答案 1 :(得分:5)

__FILE__扩展为字符串文字。您可以在类型为char const*的变量中存储指向字符串文字(的第一个字符)的指针。文字的生命周期与程序执行相同。

答案 2 :(得分:0)

谢谢大家。我知道了。

C / C ++中的字符串文字保存在静态数据段中,因此文字的生命周期与程序执行相同。

我对字符串文字与局部变量感到困惑。

再次感谢。