在C语言中以“#”开头的为预处理指令。在预处理阶段,由预处理器处理。这部分不属于C代码中被执行的一部分。通常是告诉预处理器这里应该如何处理源码。
防止重复引用头文件。
#pragma once
但#pragam是编译器相关的,它的设定的状态,或指示编译器完成一些特定的动作。如果编译器没有实现功能可能会编译报错。
也可以使用编译器无关的宏定义方法:
// 文件名为:GateWay_private.h
#ifndef RTW_HEADER_GateWay_private_h_
#define RTW_HEADER_GateWay_private_h_
// 头文件
// 主要代码
#endif /* RTW_HEADER_GateWay_private_h_ */
其中宏定义的名称没有特定的要求,只要在工程中命名唯一就行。可以根据公司规定、项目约束和个人习惯来设置。可以使用“项目+文件名”的方式,例如RTW_HEADER表示RTW工程的头文件,GateWay_private_h_为该文件的文件名。并在最后给出结束位置的提示/* RTW_HEADER_GateWay_private_h_ */
也可以直接使用文件名,只要命名唯一即可,但这种方式通常用来公用的头文件上,例如变量类型的定义:
// 文件名为:GateWay_private.h
#ifndef GATEWAY_PRIVATE_H
#define GATEWAY_PRIVATE_H
// 引用头文件
// 主要代码
#endif // !GATEWAY_PRIVATE_H
为了在C++代码中调用C写成的库文件,就需要用extern”C”来告诉编译器:这是一个用C写成的库文件,请用C的方式来链接它们。
extern “C” 表示编译生成的内部符号名使用C约定。
#ifdef __cplusplus
extern "C" {
#endif
// 引用头文件
// 主要C代码
#ifdef __cplusplus
}
#endif
这段话的上下文意思是,当C++程序调用C语言程序时,需要使用C语言的编译方式来处理这段代码。
因为C++支持函数重载,而C不支持函数重载。两者语言的编译规则不一样。编译器对函数名的处理方法也不一样。
void func(int a,int b)
{
//code
}
针对上面这个函数,C编译之后,可能为_func,而C++编译之后会产生_func_int_int之类的名字(不同的编译器可能生成的名字不 同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。
如果不区分的话,之后的链接会出现找不到具体函数的错误,会导致链接失败。
一般我们都将函数声明放在头文件,当我们的函数既有可能C使用,也有可能被C++使用时,我们无法确定是否要将函数声明在extern “C”里,所以,我们应该使用上面提到的#ifdef __cplusplus方式。