ASIC标準
__LINE__ 源代碼行号
__FILE__ 源檔案名
__DATE__ 編譯日期
__TIME__ 編譯時間
__STDC__ 當要求程式嚴格遵循ASIC C标準時該标志被指派1
__cplusplus 當編寫c++程式時該标志符被定義
gcc标準
__FILE__
__LINE__
__FUNCTION__
__BASE_FILE__ 标志主輸入檔案的名字,對于源檔案__FILE__和__BASE_FILE__是一樣的,對于頭檔案兩者可能不同。比如__BASE_FILE__這個宏在myassert.h頭檔案中定義,被main.c和func.c檔案包含之後__BASE_FILE__分别變成了main.c和fun.c,如果我們需要知道myassert.h這個宏具體在哪個檔案中定義的話,就需要用到__BASE_FILE__了。
__DATE__
__TIME__
__TIMESTAMP__ 和__TIME__的格式相同,用于得到本檔案最後一次被修改的時間。
__GNUC__、__GNUC_MINOR__、__GNUC_PATCHLEVEL__用于得到GNU版本
__VERSION__用于得到編譯器的版本
__COUNTER__自身計數器,常用于記錄以前編譯過程中出現的__COUNTER__的次數,從0開始
__INCLUDE_LEVEL__用于表示檔案被包含的計數,從0開始遞增,常作為遞歸包含的限制條件。
http://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html#Standard-Predefined-Macros
http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html#Common-Predefined-Macros
__FILE__列印絕對路徑名?
在日志中使用__FILE__來顯示源碼的檔案名,可是他顯示了絕對路徑名,這樣使得整個log看起來很長,這個其實和編譯器有關,由于編譯目錄和源碼目錄不同,是以實際在編譯的時候使用的是源碼的絕對路徑,以緻列印出來就是絕對路徑了。
#include < stdio.h>
int main()
{
printf(“%s %d\n”, __FILE__, __LINE__);
return 0;
}
使用源碼的全路徑編譯:
gcc -o filetest /srv/example/test/filetest.c
執行結果:
./filetest
/srv/example/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