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

用c语言开发的时候,我们通常将源代码放到*.c的文件(源文件),将宏定义,类型定义,函数申明等放到*.h的文件(头文件)。
一个头文件可能会被多个其他头文件包含或者源文件包含进行应用,c语言的引用(include “xx.h”)在编译的时候是以复制方式进行展开,也就是说如果你在a文件包含了b,c文件(无论是源文件还是头文件),那么编译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__定义
    这个宏的定义一般用和文件名相同的字符定义,只要你保证你整个项目没有重名的文件,那么就不会出现重名的宏定义。
    为什么要定义这个宏:如前所述,你的这个头文件可能会被多个文件包含,比如会被b,c文件都包含,同时a,文件又包含了b,c文件,如果没有这个宏的定义,编译a文件的时候就会出现两份该文件,从而出现重复定义的错误。
  2. #include “inc.h”
    在一个大型项目中,你往往会引用非常多的头文件,那么这样就会在每一个c文件的前面写一大堆的引用申明,一个小技巧就是我们可以将大家都会使用的通用文件集中放到这个inc.h的文件里面,在c文件里面只引用inc.h文件就可以了。在头文件里面也放一个引用,是因为你这个头文件在编辑的时候,它会引用其他定义,比如int8_t等,编辑器会显示一个编译警告错误(实际编译的时候并不会报错),这个引用主要是消除这个糟心的提示和红色警告。

3.extern “C”{…}
这是一个极容易被忽略,也极少使用的定义。然而在C,C++混合编程的项目中,它又是那么的重要。
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” 添加在函数内部
    重要提示:原创文章,欢迎转载,请注明来源。
  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值