2017年10月20日 星期五

C - Standard Predefined Macros


C 語言有些預先定義的巨集 ( Standard Predefined Macros ) , 
可以直接印出行數、檔案名稱、函數名稱 ...

-

例如 : 
如果要用 printf 印出行數時 , 不需要特別針對每一行去寫每一行的行數 , 
也不用因爲前面多了幾行程式 , 就要把後面 printf 要印出的行數全部重新寫

-

以下是一些較常用到的巨集
  • __LINE__   -   印出行數
  • __FILE__   -   印出檔案名稱
  • __GNUC__   -   印出 gcc 版本
  • __func__ , __FUNCTION__   -   印出函數名稱
  • __DATE__   -   印出日期
  • __TIME__   -   印出時間

-

比較特別的是 __func__ , __FUNCTION__ 兩種方式都可印出函數名稱
以下是 gcc 的網站中的define ,

# if __STDC_VERSION__ < 199901L
#    if __GNUC__ >= 2                              /* 當 __GNUC__ >= 2 */
#       define __func__ __FUNCTION__   /* __func__ , __FUNCTION__ 兩種都可以使用 */
#    else                                                     /* 當 __GNUC__ < 2 */
#       define __func__ "<unknown>"         /* 只能使用__func__ 這種方式 */
#    endif
# endif

-

以下是測試的程式

1 #include <stdio.h>
2
3 void main(void)
4 {
5         printf("\nline : %d\n", __LINE__);
6         printf("file : %s\n", __FILE__);
7
8         printf("\n__GNUC__ : %d\n", __GNUC__);
9         printf("function (__func__) : %s\n", __func__);
10       printf("function (__FUNCTION__) : %s\n", __FUNCTION__);
11
12       printf("\ndate : %s\n", __DATE__);
13       printf("time : %s\n", __TIME__);
14
15       printf("\nline : %d\n", __LINE__);
16 }

-

以下是測試的結果

line : 5
file : predefined_macros.c

__GNUC__ : 4
function (__func__) : main
function (__FUNCTION__) : main

date : Oct 19 2017
time : 17:39:48

line : 15

ref : https://stackoverflow.com/questions/7008485/func-or-function-or-manual-const-char-id

沒有留言:

張貼留言