C++中需仅获取文件名,是否有替代__FILE__的内置宏?
C++中获取仅文件名的方案
核心结论
目前没有任何版本的C++标准(从C98到C23)提供直接返回仅文件名的内置宏,必须依赖编译器扩展或自行实现。
编译器非标准扩展方案
不同主流编译器提供了各自的非标准宏或编译选项来实现需求:
- MSVC:内置
__FILE_NAME__宏,直接返回不含路径的文件名。 - GCC/Clang:
- 可使用编译选项
-fmacro-prefix-map=原路径=替换路径或-ffile-prefix-map=原路径=来剥离__FILE__中的路径前缀,比如编译时加上-ffile-prefix-map=$(pwd)=,就能让__FILE__只返回文件名。 - 也可使用
__BASE_FILE__宏,不过它返回的是预处理阶段的原始文件名,若存在头文件包含等情况,行为可能和预期有差异,需测试验证。
- 可使用编译选项
标准C++自行实现方案
如果需要跨编译器的标准实现,可以写一个编译期constexpr函数来从__FILE__中提取文件名:
#include <cstddef> constexpr const char* get_filename(const char* path) { const char* filename = path; while (*path != '\0') { if (*path == '/' || *path == '\\') { filename = path + 1; } ++path; } return filename; } // 使用示例 #define LOG_FILENAME get_filename(__FILE__)
这个函数会在编译期遍历__FILE__字符串,找到最后一个路径分隔符(兼容Windows和Unix风格路径),返回其后的文件名部分,完全符合C++标准,跨编译器可用。
内容的提问来源于stack exchange,提问作者Samuel Wenker
相关产品推荐
相关产品推荐

