今天開始正式研究gedit的源碼,第一次看c/c++的源碼,有點吃力啊,堅持不懈,慢慢來。c++
在gedit.c文件中遇到了G_BEGIN_DECLS和G_END_DECLS,日常搞C語言的東西,我我的幾乎沒這樣用過(怕是太菜了。。)遂順藤摸瓜,抽絲剝繭。(如下用G宏代替)git
由宏定義聯想這兩個東西,例如#define PRINT printf("Hello World\n");在程序中能夠直接使用PRINT輸出,G宏的形式很像宏定義啊。果然,上網一查,獲得以下定義github
//https://github.com/bratsche/glib/blob/master/glib/gmacros.h /* Guard C code in headers, while including them from C++ */ #ifdef __cplusplus # define G_BEGIN_DECLS extern "C" { # define G_END_DECLS } #else # define G_BEGIN_DECLS # define G_END_DECLS #endif
它的廬山真面目出來了,一段預處理命令。大概解釋一下,若是定義了__cplusplus,則定義G宏按照C程序風格編譯,不然按照C++風格編譯。函數
那這個__cplusplus是什麼東西呢?查閱資料可知,這是一個至關於標示的東西,stackoverflow講其值是201402L,總之值不一樣,又發如今GCC下其值爲1,它是long int型,按照此標識來用就好了。spa
若是定義了__cplusplus宏,則extern "C", 這是什麼意思呢?指的是按照C語言的風格進行編譯等。鄙人才疏學淺,C風格和C++風格的區別是什麼?例如test(int , int)C++支持重載,當編譯器對函數處理以後,獲得的名字是_test_int_int,而在C語言中,獲得的是test。應該看到區別了,這是C++專門爲了調用C函數設計的。設計
有必要複習一下extern在C語言中的應用,extern我我的理解就是外部聲明,全局可調。我寫了一個函數extern test(int, int),則我在另外一個C文件中調用test()便可。code