C/C++项目的第一行代码

以lua.h为例,它的第一行是:

#ifndef lapi_h
#define lapi_h

这是利用了C/C++的宏定义特性来防止代码文件被重复复制进最后的编译源码中,是一个预防措施,本质上并不是必须的,因为C语言的include会将对应的文件内容整个包含到最后的编译源码中,与其他所有的现代语言都不同。

假如要include的文件里有一个函数叫f1,那么最后编译出来的代码就会有一个函数叫f1,问题是假如include了这个文件两次呢?那么理论上就会有两个f1函数,这就难办了。因为绝大多数C/C++编译器是不允许有同名函数的,编译就会出错。而这个宏的意思就是如果已经包含了这个文件那么第二次include的时候内容就是空白,从而避免了一个函数被定义两次的情况。一般来说这个结构由三行代码组成, 把代码拖到文件最后,一般会有第三句:

#endif

不过光是这句难免眼花,所以写得好点的代码会带有它的标识,所以gdextension_ interface.h 中实际上是: 

#endif//GDEXTENSION_INTERFACE_H

这还不算完,下面有一些重要的内容:
开源C项目最难的是编译,以上的措施其实只是一个预防,在引用各种头文件很混乱的时候还是会发现有重复定义的函数或者是其他元素导致编译失败的情况,这时候就要具体内容具体分析了,一般的做法是先想办法尽量减少引用的头文件,一般来说这时候是编译错误灾难的开始,是各种编译器错误提示爆发的开端。这时候尽量不要修改开源项目中的各种文件引用顺序,最好是改你自己白的源码中的头文件引用顺序,当然也不是绝对,只是一个成熟的开源项目头文件的引用顺序肯定是经历了无数的错误后形成的,不到万不得已,不改为好。

还有一种更难处理的情况, 两个同名函数导致的编译错误并不是inclue造成的,而是使用的库中本身已经有了一个同名的函数。这种情况绝大多数是无解的,除了修改你自己的函数名别无它法,最可怕的是,那个同名函数是两个不同的开源库自带的。

总之定义重复问题贯穿了纯C语言程序开发的始终,极大的影响了纯C语言的代码编写。很多C语言代码都是为了避免定义重复而生的, 这占了C语言代码中代码量的相当大部分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值