在 vs2015 开发环境中,使用 __FILE__ 可输出文件名;
但是,会把绝对路径也输出,导致文件名很长;
//========================================================================
那么,我们可以对 __FILE__ 宏进行操作,只提取文件名;如下:
因为windows和linux下,文件名中的路径分隔符号不同,windows中是"/",而linux中是"/",所以,采用的宏不同:
#include <string.h> //strrchr()函数所需头文件
windows:
#define filename(x) strrchr(x,'\\')?strrchr(x,'\\')+1:x
linux:
#define filename(x) strrchr(x,'/')?strrchr(x,'/')+1:x
调用:
printf("filename:%s\n", filename(__FILE__) );
相关函数说明:
函数原型:char *strrchr(const char *s, int c);
函数功能:The strrchr() function returns a pointer to the last occurrence of the character 【c】 in the string 【s】.函数返回一个指向最后一次出现在字符串s中的字符c的位置指针,如果c不在s中,返回NULL。
PS:linux中提供了相应的函数:basename(s),用来获取不带路径的文件名。
//========================================================================
最终,可以使用如下:
#include <string.h> //strrchr()函数所需头文件
#ifdef WIN32
//windows:
#define filename(x) strrchr(x,'\\')?strrchr(x,'\\')+1:x
#else
//linux:
#define filename(x) strrchr(x,'/')?strrchr(x,'/')+1:x
#endif
extern char log_buf[];
extern int log_printf(char* pstr);
//=======================================
//=======================================
#define TLOG_NOTICE 0
#define TLOG_WARNING 1
#define TLOG_ERROR 2
#define TLOG(LEVEL, fmt, ...)\
do {\
if (TLOG_NOTICE == LEVEL) \
{ \
fprintf(stdout, "%s(%d)" fmt, filename(__FILE__), __LINE__ , ##__VA_ARGS__);\
} \
else if (TLOG_WARNING == LEVEL)\
snprintf(log_buf, 256, "WARNING:[%s:%d]:" fmt, filename(__FILE__), __LINE__, ##__VA_ARGS__);\
else if (TLOG_ERROR == LEVEL)\
snprintf(log_buf, 256, "ERROR:[%s:%d]:" fmt, filename(__FILE__), __LINE__ , ##__VA_ARGS__);\
} while(0)
#define LOG(fmt, ...)\
TLOG(TLOG_NOTICE, fmt, ##__VA_ARGS__)
#define LOGW(fmt, ...)\
TLOG(TLOG_WARNING, fmt, ##__VA_ARGS__)
#define LOGE(fmt, ...)\
TLOG(TLOG_ERROR, fmt, ##__VA_ARGS__)
//========================================================
只需要99元就可以投资自己,掌握Linux系统编程!主要传授《Linux C/C++程序设计》《Linux 系统编程》,主页有学习视频!
只需要99元就拥有全部课程和资料,让我们用技术改变自己,改变生活,改变世界!
视频可以百度搜索:韦凯峰Linux编程学堂