赞
踩
用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
几个特殊的地方说明:
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"
{
double sin(double);
int max(int, int);
}
extern "C"
{
#include <stdint.h>
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。