从G_BEGIN_DECLS和 G_END_DECLS说起

痴心易碎 提交于 2019-12-19 17:08:58

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

    今天开始正式研究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()即可。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!