C++预定的宏有那个可以取文件名?

turbocamel 2010-01-28 10:01:14
我知道__FILE__在编译是就转换为文件名,但是这个文件名是包含了路径的。
我想在想知道有没有一个宏可以只取文件名,不要路径名。
如果可能,也可以自己写这样的宏,但是要求在编译时就确定文件名,而不是运行时才确定。
谢谢。
...全文
628 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
turbocamel 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 kingstarer 的回复:]
有一个比较麻烦,但是相对耗CPU较少的方法
假设工程的所有文件都在同一个目录下面,例如
/home/user/c++/

先在一个公用头文件,如stdafx.h里面定义
#define TOP_DIR_LEN 14

假设a.cpp文件位于/home/user/c++/model

则在a.cpp最前面加上宏定义
#define __FILENAME__ (__FILE__ + TOP_DIR_LEN + 6)


这样就可以获得一个只有文件名的字符串了

由于编译器的优化,一般来说(__FILE__ + TOP_DIR_LEN + 6)会被优化成一个固定的数值
不会等到运行时再计算指针偏移,所以运行效率比起以前应该没多大区别


[/Quote]
我刚才按照你的方法编译了一下,在VC 2003下是不行的,因为__FILE__在编译时被转换为字符串,字符串是无法和整数相加的
turbocamel 2010-02-01
  • 打赏
  • 举报
回复
对不起,脑袋有点晕,没看清,说了一句胡话
turbocamel 2010-02-01
  • 打赏
  • 举报
回复
嗯,这个倒是一个不错的选择,不过__FILENAME__这个宏从何而来,是Linux专有的吗?
kingstarer 2010-01-29
  • 打赏
  • 举报
回复
有一个比较麻烦,但是相对耗CPU较少的方法
假设工程的所有文件都在同一个目录下面,例如
/home/user/c++/

先在一个公用头文件,如stdafx.h里面定义
#define TOP_DIR_LEN 14

假设a.cpp文件位于/home/user/c++/model

则在a.cpp最前面加上宏定义
#define __FILENAME__ (__FILE__ + TOP_DIR_LEN + 6)


这样就可以获得一个只有文件名的字符串了

由于编译器的优化,一般来说(__FILE__ + TOP_DIR_LEN + 6)会被优化成一个固定的数值
不会等到运行时再计算指针偏移,所以运行效率比起以前应该没多大区别

turbocamel 2010-01-29
  • 打赏
  • 举报
回复
谢谢各位,C++标准当中可能确实没有这样的宏,但是是否能够自己去写一个这样的宏呢?
期待高手出现!
kingstarer 2010-01-29
  • 打赏
  • 举报
回复
o 要编译时确定那只能修改编译器选项了
kingstarer 2010-01-29
  • 打赏
  • 举报
回复
可以通过编译器选项设置

或者这样写strrchr(__FILE__, '\\') + 1
cattycat 2010-01-29
  • 打赏
  • 举报
回复
VC可以用
__FILE__
不知道gcc是否有这个。
kingstarer 2010-01-29
  • 打赏
  • 举报
回复
各个编译器不一样的 用man查一下帮助看看
turbocamel 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 hqin6 的回复:]
引用 13 楼 turbocamel 的回复:
引用 12 楼 hqin6 的回复:
引用 11 楼 turbocamel 的回复:
  我这么处理的原因是写日志的时候文件名太长,看起来太费劲,而如果通过函数去截取的话,对CPU是一种浪费,本来这些都是属于编译时应该确定的常量


C/C++ code__FILE__


The name of the current source file. __FILE__ expands to astring enclosedindouble quotation marks. To make sure that the full path of the fileis displayed, use/FC (Full Path of Source Code Filein Diagnostics).


你说的这个方法适用于VS2005以后的编译器,我的VS2003就没有这个选项。另外,linux下也不知道该如何设置。

C/C++ code
linux:

#include<iostream>
#include<string>usingnamespace std;int main ()
{
cout<< __FILE__<< endl;return0;
}

output:

[test]$ g++ main.cpp
[test]$ ./a.out
main.cpp
[test]$ gcc-v
Reading specs from/usr/lib/gcc/x86_64-redhat-linux/3.4.6/specs
Configured with: ../configure--prefix=/usr--mandir=/usr/share/man--infodir=/usr/share/info--enable-shared--enable-threads=posix--disable-checking--with-system-zlib--enable-__cxa_atexit--disable-libunwind-exceptions--enable-java-awt=gtk--host=x86_64-redhat-linux
Thread model: posix
gcc version3.4.620060404 (Red Hat3.4.6-10)
[test]$
[/Quote]
哦,谢谢了,我会在linux下测试一下。Windows上还是使用VS2005吧,可就是一堆编译器的警告要客服了。
太乙 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 turbocamel 的回复:]
引用 12 楼 hqin6 的回复:
引用 11 楼 turbocamel 的回复:
我这么处理的原因是写日志的时候文件名太长,看起来太费劲,而如果通过函数去截取的话,对CPU是一种浪费,本来这些都是属于编译时应该确定的常量


C/C++ code__FILE__


The name of the current source file. __FILE__ expands to astring enclosedindouble quotation marks. To make sure that the full path of the fileis displayed, use/FC (Full Path of Source Code Filein Diagnostics).


你说的这个方法适用于VS2005以后的编译器,我的VS2003就没有这个选项。另外,linux下也不知道该如何设置。
[/Quote]

linux:

#include <iostream>
#include <string>
using namespace std;
int main ()
{
cout << __FILE__ << endl;
return 0;
}

output:

[test]$ g++ main.cpp
[test]$ ./a.out
main.cpp
[test]$ gcc -v
Reading specs from /usr/lib/gcc/x86_64-redhat-linux/3.4.6/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-java-awt=gtk --host=x86_64-redhat-linux
Thread model: posix
gcc version 3.4.6 20060404 (Red Hat 3.4.6-10)
[test]$
turbocamel 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 hqin6 的回复:]
引用 11 楼 turbocamel 的回复:
我这么处理的原因是写日志的时候文件名太长,看起来太费劲,而如果通过函数去截取的话,对CPU是一种浪费,本来这些都是属于编译时应该确定的常量



C/C++ code__FILE__


The name of the current source file. __FILE__ expands to astring enclosedindouble quotation marks. To make sure that the full path of the fileis displayed, use/FC (Full Path of Source Code Filein Diagnostics).
[/Quote]

你说的这个方法适用于VS2005以后的编译器,我的VS2003就没有这个选项。另外,linux下也不知道该如何设置。
太乙 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 turbocamel 的回复:]
我这么处理的原因是写日志的时候文件名太长,看起来太费劲,而如果通过函数去截取的话,对CPU是一种浪费,本来这些都是属于编译时应该确定的常量
[/Quote]


__FILE__


The name of the current source file. __FILE__ expands to a string enclosed in double quotation marks. To make sure that the full path of the file is displayed, use /FC (Full Path of Source Code File in Diagnostics).
turbocamel 2010-01-29
  • 打赏
  • 举报
回复
我这么处理的原因是写日志的时候文件名太长,看起来太费劲,而如果通过函数去截取的话,对CPU是一种浪费,本来这些都是属于编译时应该确定的常量
  • 打赏
  • 举报
回复
楼主,路径文件名都有了。还不会自己解析字符串,取最后一个'\\'后面的东西么?
十八道胡同 2010-01-28
  • 打赏
  • 举报
回复
可以获得全部的路径,为何不截取文件名?
cocat 2010-01-28
  • 打赏
  • 举报
回复
学习了~
jackzhhuang 2010-01-28
  • 打赏
  • 举报
回复
重新考虑一下程序逻辑,包含了路径的文件名已经给你了,没必要再提供只有文件名的宏了,所以你应该考虑一下程序的逻辑实现,是不是做到可以不需要关心文件名是否包含路径。
nineforever 2010-01-28
  • 打赏
  • 举报
回复
在VC中只有开了/FC选项,__FILE__才会返回完整路径。
参见http://msdn.microsoft.com/en-us/library/027c4t2s.aspx
lylm 2010-01-28
  • 打赏
  • 举报
回复
应该没有这样的宏,本来文件名就是包含路径的概念,自己写吧
加载更多回复(2)

65,028

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧