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语言对于函数的标识不同而出现链接错误的情况。