移出范围后,指向__FILE__的指针是否仍然有效?

时间:2016-06-05 21:29:52

标签: c++ debugging

如果我想将__FILE__传递给某个对象,是否需要复制该字符串,或者我可以将其指针存储为const char*

我猜我需要制作一份副本,因为我认为一旦它超出范围就会解脱。

指向__FILE__的指针是否提供任何保证?

3 个答案:

答案 0 :(得分:8)

__FILE__扩展为普通字符串文字。因此,只要您只是阅读它,您就可以使用const char*之类的

const char *filename = __FILE__;

由于字符串文字具有静态存储持续时间,因此指针在整个程序中保持有效。

如果你想要一些可修改的东西,你需要一份副本并自己管理它的生命周期。

有关预定义标准宏的完整列表以及有关它们扩展内容的信息,请查看this documentation page上的"预定义宏" 部分。

正如@Keith Thompson comment正确指出的那样,__FILE__的不同扩展可能会或可能不会产生相同的地址,即:

const char *f1 = __FILE__;
const char *f2 = __FILE__;
assert(f1 == f2);              // May or may not fire

我不确定什么时候会咬你,但我知道这很好。

答案 1 :(得分:3)

__FILE__是预处理器宏,在预处理器运行时由字符串文字替换。任何使用它就好像您在源代码中键入"filename.c"一样。它不是一个指针,它没有作用域,也没有被释放 - 那些是不适用的编译时和运行时概念。

答案 2 :(得分:1)

  

我猜我需要制作一份副本,因为我认为一旦它超出范围,它就会自行解脱。

不,这是一个字符文字。它没有超出范围

  

指向__FILE__的指针是否提供任何保证?

是。如上所述,它被推断为const char[]字符文字类型,这表明您不需要关心内存管理。

相关问题