C/C++中標準巨集定義及其用法
阿新 • • 發佈:2018-11-10
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