从G_BEGIN_DECLS和 G_END_DECLS说起

原创
2016/12/21 10:40
阅读数 705

    今天开始正式研究gedit的源码,第一次看c/c++的源码,有点吃力啊,坚持不懈,慢慢来。

    在gedit.c文件中遇到了G_BEGIN_DECLSG_END_DECLS,平常搞C语言的东西,我个人几乎没这样用过(怕是太菜了。。)遂顺藤摸瓜,抽丝剥茧。(以下用G宏代替)

    由宏定义联想这两个东西,例如#define PRINT printf("Hello World\n");在程序中可以直接使用PRINT输出,G宏的形式很像宏定义啊。果真,上网一查,得到如下定义

//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型,按照此标识来用就行了。

    如果定义了__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()即可。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部