本來這個是只應該出現在運用cpp編程的工程中的,但是,就算是單片機編程,都已經會看到這個了,所以提出來解釋一下。
條件編譯,屬於c/c++共有的,但是由於在有些場合,在c++代碼內嵌c語言能使編程更加便利。
使用c語言編譯器gcc編譯下面代碼:
#include<stdio.h> #ifdef __cplusplus extern "C" { #endif int a=10; #ifdef __cplusplus } #endif int main(void) { printf("%d",a); return 0; }
預編譯(gcc -E)之后是這樣的:
這樣可以確定在C語言gcc編譯器中是沒有__cplusplus這個宏的,那么我們用g++編譯器上面程序呢?
可以看出g++預編譯之后,能夠識別__cplusplus這個宏。
所以,結論已經很明顯了。本來如同#ifdef XXXXX這樣的條件編譯,需要人為定義一個匹配的宏,但是,在c++編譯器中,已經內置了這個宏的定義,所以在使用c++編譯器編譯其他語言(這里是C語言,當然得編譯器支持的語言哈)時,用上這樣的方式,可以讓編譯器把extern “C”代碼塊中的內容按照C語言的編譯方式進行編譯。為什么要這樣呢?因為c++中支持函數重載,而C語言不支持,c++對函數經過了其他處理,如果不加extern “C”限制按照C語言的方式編譯,那么c++編譯器在編譯C語言函數時可能就會找不到鏈接路徑而報錯。
那么再看到下面這種代碼,應該也不會再陌生了。
#ifdef __cplusplus
extern "C" {
#endif
/*add somethings*/
#ifdef __cplusplus
}
#endif