天天看點

預定義宏

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