1. 程式人生 > >C/C++中標準巨集定義及其用法

C/C++中標準巨集定義及其用法

ANSI C標準中有幾個標準預定義巨集

  • __func__:在原始碼中插入當前所在函式名;
  • __LINE__:在原始碼中插入當前原始碼行號;
  • __FILE__:在原始檔中插入當前原始檔名;
  • __DATE__:在原始檔中插入當前的編譯日期
  • __TIME__:在原始檔中插入當前編譯時間;
  • __cplusplus:編譯C++程式該識別符號被定義。

 前面幾個(func...TIME)常用於printf/sprintf等列印語句中:

//輸出日期、時間、原始檔名、所在行
//Data-Time:Sep 29 2018	  11:55:19	FileName:test.cpp Line:31
printf("Data-Time:%s  %s  FileName:%s  Line:%d\n", __DATE__, __TIME__,
                                     __FILE__, __LINE__);
         

//cpp檔案會被編譯成c++的格式__cplusplus
//c檔案只有使用gcc編譯時才不會定義__cplusplus,如果使用g++編譯則會定義
#ifdef __cplusplus                    
    printf("__cplusplus exist\n");    
#else                                 
    printf("__cplusplus not exist\n");
#endif                                                                                    

                                                                                            

__cplusplus常用於標頭檔案中使用:

#ifndef _ZX_FUNC_H
#define _ZX_FUNC_H
 
#ifdef __cplusplus
extern "C" {
#endif
 
/* functions */
char *strdup (const char *s);
 
#ifdef __cplusplus
}
#endif
 

#endif

     上段程式碼中的strdup()函式使用C編譯時,會轉譯成_STRDUP()標識。如果使用C++編譯,C++存在多型的概念,函式會被轉譯中_STRDUP_CHAR()標識。因為這個不同,在C++程式碼中如果直接呼叫C編譯的函式會找不到函數了,這時就需要extern “C” 了。 extern"C"會告訴C++編譯器引用的函式或變數是C編譯的,名字是不一樣的,你要找....,問題就解決了。

在C++中呼叫C的程式碼,需要注意兩點:

  • 被呼叫方,即C中的函式或變數宣告為extern型別
  • 呼叫方,即C++中將函式或變數用extern "C"修飾。

啟用巨集

    宣告巨集有兩種方法,一是通過#define命令,這需要修改原始碼的,二是在Makefile中使用-D編譯選項設定,參考下面的程式碼:

g++ test.cpp -o test -D __DEBUG  
//通過“-D __DEBUG”開關靈活控制啟用不同的程式碼 
                   
#ifdef __DEBUG                                                      
    printf("in Debug\n");                                           
#elif
    printf("in Release\n");
#endif