php endall(),从G_BEGIN_DECLS和 G_END_DECLS说起

," "博主开始研究gedit的C/C++源码,遇到G_BEGIN_DECLS和G_END_DECLS宏,了解到它们用于C++头文件中保护C代码。文章解释了__cplusplus宏的作用,以及extern"C"如何处理C语言和C++的编译差异。博主还探讨了extern在C语言中的用途,以及C和C++风格函数名的区别。"
摘要由CSDN通过智能技术生成

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

在gedit.c文件中遇到了G_BEGIN_DECLS和G_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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值