如果我想将__FILE__
传递给某个对象,是否需要复制该字符串,或者我可以将其指针存储为const char*
?
我猜我需要制作一份副本,因为我认为一旦它超出范围就会解脱。
指向__FILE__
的指针是否提供任何保证?
答案 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[]
字符文字类型,这表明您不需要关心内存管理。