C++中的__FILE__
最近在写项目时,发现一个非预期的结果。最后归结到程序用到的__FILE__
上。一句话总结便是,__FILE__
的结果是不可预期的。
项目时,我用__FILE__
获取当前文件的位置,再通过相对路径获取一个配置文件的地址来读取。最后发现,在debug
模式下可以正确读取到配置文件,但在release
程序中找不到该配置文件。输出文件地址可以看到,在debug
模式下,__FILE__
返回的是该文件的全路径,即D:\path\file.cpp
这样的。但在release
编译时,__FILE__
返回的只有文件名,这样后续读取配置文件便找不到文件。
如果看官方的定义,__FILE__
的确只确保返回文件名。还有一种说法是,__FILE__
返回的是编译时该文件的输入的地址。比如当前文件是D:\path1\path2\file.cpp
:
- 如果编译命令为
gcc file.cpp
,这时候只返回file.cpp
。 - 如果编译命令为
gcc path2\file.cpp
,返回path2\file.cpp
。 - 如果编译命令为
gcc D:\path1\path2\file.cpp
,返回D:\path1\path2\file.cpp
。
这样的结果也是合理的。因为__FILE__
是编译器解释的一个宏,它自己也不会自动获取文件的全路径,只能获得输入时的部分路径信息。现在我不确定为何VS
在不同编译模式下会给出不同的结果。无论如何,鉴于__FILE__
的不稳定性,它不能用来去指定文件的位置。