c 语言头文件的那些事

#ifndef __APT_PTHREAD_H__
#define	__APT_PTHREAD_H__

#ifdef __cplusplus
extern "C" {
#endif

#include <stdarg.h>
#include <stdio.h>

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* __APT_PTHREAD_H__ */

1.防止头文件重复包含

#ifndef _FILE_H_

#define _FILE_H_ 
...
#endif


2.c 与c++ 互调时的c函数声明

当我们想从C++中调用C的库时,不能仅仅声明一个外部函数,因为调用C函数的编译代码和调用C++函数的编译代码是不同的。
如果你仅说明一个外部函数, C++编译器假定它是C++的函数编译成功了,但当你连接时会发现错误。这是因为编译方法的不同造成的。

C++支持函数重载,而C不支持,两者的编译规则也不一样。
函数被C++编译后在符号库中的名字与C语言的不同。

例如,假设某个函数的原型为: void foo( int x, int y );

该函数被C编译器编译后在符号库中的名字可能为_foo,而C++编译器则会产生像_foo_int_int之类的名字
(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。
_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。

解决这种问题的方法就是指定它为C函数:
extern "C" 函数描述
extern "C"表示编译生成的内部符号名使用C约定

指定一群函数的话:
extern "C"{
n个函数描述
}

如果想C和C++混用的话:

#ifdef _cplusplus
extern "C"{
#endif

n个函数描述

#ifdef _cplusplus
}
#endif


下面以例子说明,如何在C++中使用C的函数,

//C++引用C函数的例子
//test.c

#include <stdio.h>
void mytest()
{
     printf("mytest in .c file ok\n");
}

//main.cpp
extern "C"
{
     void mytest();
}

int main()
{
    mytest();
    return 0;
}

参考文章

http://hi.baidu.com/mayday428/blog/item/5d9f5ccf5839600100e9285c.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值