C语言编程标准头文件格式推荐及其含义解释(#ifndef,#define,extern “C“,#endif)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

用c语言开发的时候我们通常将源代码放到*.c的文件源文件将宏定义类型定义函数申明等放到*.h的文件头文件。
一个头文件可能会被多个其他头文件包含或者源文件包含进行应用c语言的引用include “xx.h”在编译的时候是以复制方式进行展开也就是说如果你在a文件包含了bc文件无论是源文件还是头文件那么编译a文件的时候它会先把b.c文件的内容放到a文件一起展开形成一个文件然后再进行编译。
在一个多人合作开发或者混合语言开发的时候我们的一个项目文件可能会包含其他c++asm等文件要让编译器能正确高效的处理这些情况我们需要精心的编写一个好的头文件以避免出现一些编译文件。
一个比较通用的模板头文件template.h)结构如下


```c
#ifndef __TEMPLATE_H__
#define	__TEMPLATE_H__
#include "inc.h"

#ifdef __cplusplus
 extern "C" {
#endif /* __cplusplus */
///
//这里放你的相关定义内容
//

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif 

几个特殊的地方说明

  1. 全局宏__TEMPLATE_H__定义
    这个宏的定义一般用和文件名相同的字符定义只要你保证你整个项目没有重名的文件那么就不会出现重名的宏定义。
    为什么要定义这个宏如前所述你的这个头文件可能会被多个文件包含比如会被bc文件都包含同时a文件又包含了bc文件如果没有这个宏的定义编译a文件的时候就会出现两份该文件从而出现重复定义的错误。
  2. #include “inc.h”
    在一个大型项目中你往往会引用非常多的头文件那么这样就会在每一个c文件的前面写一大堆的引用申明一个小技巧就是我们可以将大家都会使用的通用文件集中放到这个inc.h的文件里面在c文件里面只引用inc.h文件就可以了。在头文件里面也放一个引用是因为你这个头文件在编辑的时候它会引用其他定义比如int8_t等编辑器会显示一个编译警告错误实际编译的时候并不会报错这个引用主要是消除这个糟心的提示和红色警告。

3.extern “C”{…}
这是一个极容易被忽略也极少使用的定义。然而在CC++混合编程的项目中它又是那么的重要。
extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。
由于C++支持函数重载因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中而不仅仅是函数名而C语言并不支持函数重载因此编译C语言代码的函数时不会带上函数的参数类型一般只包括函数名。
例如函数void foo(int, int)编译后的可能是_foo_int_int(不同编译器可能不同但都采用了类似的机制用函数名和参数类型来命名编译后的函数名)而C语言没有类似的重载机制一般是利用函数名来指明编译后的函数名的对应上面的函数可能会是_foo这样的名字.所以如果你在c语言文件中调用一个c++文件中申明的foo函数就会找不到这个符号。
extern是C/C++语言中表明函数和全局变量的作用范围的关键字该关键字告诉编译器其申明的函数和变量可以在本模块或其他模块中使用.
被extern "C"修饰的变量和函数是按照C语言方式进行编译和链接的.如上我们在{}体中的变量和函数申明就会按照C语言方式编译和链接而不会按照c++方式。

extern "C"的使用

  • 可以是的单一语句
extern "C" double sin(double);
  • 可以是复合语句, 相当于复合语句中的声明都加了extern “C”
extern "C"
{
      double sin(double);
      int max(int, int);
}
  • 可以包含头文件相当于头文件中的声明都加了extern “C”
extern "C"
{
    #include <stdint.h>
} 
  • 不可以将extern “C” 添加在函数内部
    重要提示原创文章欢迎转载请注明来源。
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

“C语言编程标准头文件格式推荐及其含义解释(#ifndef,#define,extern “C“,#endif)” 的相关文章