C/C++杂谈(0) - 头文件后缀区分的必要性

关于后缀名

我们都知道,软件可以以文件头格式为判断依据,判断文件的实际类型。但这个做法对于纯文本文件是不适用的,因为纯文本文件一般没有可识别的文件头格式。正巧,源代码文件就是纯文本,因此,软件只能以后缀名推断这是什么类型的文件。
于是我们有如下表格:

类型后缀
C源代码.c
C++源代码.cpp, .cc, .cxx
C头文件.h
C++头文件.hpp, .hxx

在日常工作中不难注意到,C++也可以使用.h头文件,很多人也的确是这么做的。对于C++兼容的C库,这样做当然没问题,但对于C++库,这样做就有很多缺点。

C和C++的兼容性

我们都知道C++很大程度上是兼容C的,但很少有人强调,这种兼容并非完全兼容。

常见的不被兼容的C代码

布尔类型

有很多教材和人员声称“C没有布尔类型”,很不幸,这样的教材要么就是过时了,要么就是未经考证的人云亦云。这种说法在现在已经是错误的了,只要你的C库版本不是太旧。C语言标准库中有个stdbool.h,它提供了_Bool类型,这就是C中最早的布尔型。而如果你在C++代码中引用cstdbool头文件(正常而言,任何标准C库头文件都可以通过去掉.h后缀并加上c前缀变为C++兼容的头文件),且编译时使用MSVC并指定C++17或更高的语法标准,就会收到警告:cstdbool已经在C++17中被贬斥,换言之,是一个已经不再受到标准完整支持的特性。这意味着如果你坚持在C++代码中引用这个C特性,就有可能出问题。

register关键字

这个关键字在C++也被贬斥了。较新版本的clang编译套装现在会对该关键字直接报错,尽管有些编译器保留着对其的支持。这意味着如果试图在C++代码中引用包含register关键字的C头文件,就会遇到些跨平台上的麻烦问题。

auto关键字

在C语言中,auto关键字是教材中和extern、static、register经常一起出现的关键字。但是C++中,auto关键字的含义变得完全不同了。auto int x;这样的代码在C下仍可以正常编译,但在新的语法标准中这是语法错误的语句。

为C和C++头文件使用不同后缀的好处

  • 首先就像前文所述,C和C++已经出现了很多语法不兼容的现象,区分后缀名有助于帮助程序员在不必打开文件查看、也不必查阅文档的情况下辨别头文件所适用的语言,减少犯错的机会。
  • 由于程序员这时可以更好更快地辨认出C和C++版本的区别,如果你的库同时支持C和C++,你的用户将能很快认识到ta可以做出选择,而不是傻乎乎地在自己不熟悉的语法细节上浪费时间。
  • 帮助语法高亮设施更好地辨别语言,对语法上有差异的部分进行正确的高亮。
  • 如果你的库同时兼容C和C++,使用不同后缀将会允许你使用不同后缀相同前缀的文件名。
    最后我们再次强调:C和C++是不同的语言,C++对C的兼容并不全面,C++也不是C with classes,就算你真的只会使用C语法和class来写C++程序。
    参考:StackOverflow: c++ - *.h or *.hpp for your class definitions
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值