從G_BEGIN_DECLS和 G_END_DECLS提及

    今天開始正式研究gedit的源碼,第一次看c/c++的源碼,有點吃力啊,堅持不懈,慢慢來。c++

    在gedit.c文件中遇到了G_BEGIN_DECLSG_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

相關文章
相關標籤/搜索