C/C++ | 查漏补缺

C/C++ | 查漏补缺记录

关于C语言中代码段的注释问题

直接使用/**/来进行注释可能会因为代码段中本身存在注释语句而造成问题。要从逻辑上删除一段C代码,更好的方法是使用#if指令。

#if 0
	statements
#endif

关于如何防止一个头文件在某个源文件中被重复包含和编译

当出现类似如下情况的时候,头文件b.h可能会被多次包含。

/*file:test.cpp*/
#include<a.h>
#include<b.h>
...

/*file: a.h*/
#include<b.h>
...

/*file: b.h*/
...

这可能会导致b.h被多次包含和编译。 假如b.h中定义了某个变量,如 int b,在编译test.cpp的时候,会导致重复定义错误。

假如a.h中包含了b.h,b.h中也包含了a.h,在预处理阶段就会出现无限循环编译的情况。

为了防止这种问题的产生,可以采用#ifndef #define #endif的结构。

/*file: a.h*/
#ifndef _A_H
#define _A_H
...
#include<b.h>
...
#endif

这样,在预处理阶段,首先会展开a.h文件,执行到#ifndef _A_H时,由于还没有定义_A_H,会向下执行语句#define _A_H及后续语句,直到a.h展开完毕,之后展开b.h(此时假设b.h中也包含a.h),当展开b.h中包含的a.h时,会发现_A_H已经被定义,此时直接跳过ifndef。就可以避免多次定义的情况(要避免b.h被多次包含的话,同样需要定义_B_H)。

为了保持程序的严谨性,所有的头文件都应该以此形式进行定义。

extern "C"

#ifdef __cplusplus			//如果使用的是C++的编译器
extern "C"{
  C Code
}
#endif

使用extern "C"{}的作用主要是为了能够实现C++代码正确调用其他的C语言代码,加上这段代码后,会指示编译器对于这部分的代码内容采用C语言(而不是C++)的方式来进行编译。

主要是为了处理C++和C语言在某些方面,如是否支持函数重载(C++会将函数名和参数类型结合来在编译后的文件中指示某个函数,而C语言由于不存在重载机制,只会以文件名来指示函数),存在的不同。使得C++可以更好地支持原有的C代码和语言库。

防止出现在链接阶段,由于C++和C语言对于函数的标识不同而出现链接错误的情况。

全部评论

相关推荐

02-11 12:20
门头沟学院 Java
面试中的青提很胆小:我不信有比我们学校更逆天的,计算机专业就业第一位是我们学校二餐厅的打印店
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 听劝,这个简历怎么改 #
14081次浏览 182人参与
# 面试被问“你的缺点是什么?”怎么答 #
6309次浏览 98人参与
# 水滴春招 #
16269次浏览 346人参与
# 入职第四天,心情怎么样 #
11280次浏览 63人参与
# 租房找室友 #
8005次浏览 53人参与
# 读研or工作,哪个性价比更高? #
26151次浏览 356人参与
# 职场新人生存指南 #
199185次浏览 5509人参与
# 参加完秋招的机械人,还参加春招吗? #
26960次浏览 276人参与
# 文科生还参加今年的春招吗 #
4101次浏览 31人参与
# 简历无回复,你会继续海投还是优化再投? #
48619次浏览 561人参与
# 你见过最离谱的招聘要求是什么? #
144708次浏览 829人参与
# 如果重来一次你还会读研吗 #
155714次浏览 1706人参与
# 机械人选offer,最看重什么? #
69076次浏览 449人参与
# 选择和努力,哪个更重要? #
44269次浏览 492人参与
# 如果再来一次,你还会学硬件吗 #
103643次浏览 1245人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
20519次浏览 413人参与
# 招聘要求与实际实习内容不符怎么办 #
46703次浏览 494人参与
# 22届毕业,是读研还是拿外包offer先苟着 #
4652次浏览 27人参与
# 你们的毕业论文什么进度了 #
901211次浏览 8960人参与
# 软开人,你觉得应届生多少薪资才算合理? #
81371次浏览 496人参与
# 国企还是互联网,你怎么选? #
109189次浏览 853人参与
牛客网
牛客企业服务