在日誌中,使用到__FILE__
來顯示源碼的文件名,可它顯示了絕對路徑,這樣使得整個log看起來很長,主要log都顯示在了右邊,讓人看着非常不舒服。查找了半天才知道這是編譯形成的,因爲編譯目錄和源碼目錄不一樣,因此在實際編譯的時候使用的是源碼的絕對路徑,以至打印出來就是絕對路徑了(這樣的解釋不是很準確,有待改進)。測試
針對這種現象,使用如下的例子做爲測試。日誌
#include <stdio.h> int main(int argc, char **argv) { printf("%s, %d\n", __FILE__, __LINE__); return 0; }
使用源碼的全路徑編譯:code
$ gcc -o filetest /srv/example/c/test/filetest.c
執行結果:源碼
$ ./filetest /srv/example/c/test/filetest.c, 5
爲了解決以上問題,固然能夠改變編譯的方式:string
$ gcc -o filetest filetest.c
執行結果:io
$ ./filetest filetest.c, 5
可對項目而言,改動一下會牽動不少的東西,那麼能夠對__FILE__
進行一些操做:編譯
#define __FILENAME__ (strrchr(__FILE__, '/') ? (strrchr(__FILE__, '/') + 1):__FILE__)
測試代碼修改以下:test
#include <string.h> #include <stdio.h> #define __FILENAME__ (strrchr(__FILE__, '/') ? (strrchr(__FILE__, '/') + 1):__FILE__) int main(int argc, char **argv) { printf("%s, %d\n", __FILENAME__, __LINE__); return 0; }
執行結果:gcc
$ ./filetest filetest.c, 8
考慮到以上的操做須要兩次執行strrchr
,這種方案也被槍斃掉了。最後採起了換行的操做,只是使用腳本去分析log文件時有很大的不便,不能快速定位到哪一個文件,畢竟它們顯示在不一樣行上。file