1. 程式人生 > >__FILE__顯示全路徑的問題

__FILE__顯示全路徑的問題

https://segmentfault.com/a/1190000000600442

在日誌中,使用到__FILE__來顯示原始碼的檔名,可它顯示了絕對路徑,這樣使得整個log看起來很長,主要log都顯示在了右邊,讓人看著很是不舒服。查找了半天才知道這是編譯造成的,由於編譯目錄和原始碼目錄不同,所以在實際編譯的時候使用的是原始碼的絕對路徑,以致打印出來就是絕對路徑了(這樣的解釋不是很準確,有待改進)。

針對這種現象,使用以下的例子作為測試。

#include <stdio.h>

int main(int argc, char **argv)
{
    printf("%s, %d\n", __FILE__, __LINE__);

    return
0; }

使用原始碼的全路徑編譯:

$ gcc -o filetest /srv/example/c/test/filetest.c

執行結果:

$ ./filetest 
/srv/example/c/test/filetest.c, 5

為了解決以上問題,當然可以改變編譯的方式:

$ gcc -o filetest filetest.c

執行結果:

$ ./filetest 
filetest.c, 5


可對專案而言,改動一下會牽動很多的東西,那麼可以對__FILE__進行一些操作:

#define __FILENAME__ (strrchr(__FILE__, '/') ? (strrchr(__FILE__, '/') + 1
):__FILE__)

測試程式碼修改如下:

#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;
}

執行結果:

$ ./filetest 
filetest.c, 8

考慮到以上的操作需要兩次執行strrchr

,這種方案也被槍斃掉了。最後採取了換行的操作,只是使用指令碼去分析log檔案時有很大的不便,不能快速定位到哪個檔案,畢竟它們顯示在不同行上。