免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3060 | 回复: 4
打印 上一主题 下一主题

让C支持C++编译器的头文件写法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-18 21:37 |只看该作者 |倒序浏览
各位大侠,小弟又来求教了。
写一个C头文件,使得C函数int sum(int, int)能同时被C和C++编译器支持。小弟对下面这个头文件有些不太理解。

#ifndef SUM_H
#define SUM_H

#ifdef _cplusplus
extern "C" {                                                                  //小弟想问:1.这句是什么意思?extern还是指存储类型吗?
#endif        /*_cplusplus*/                                            //               2.这个{}为什么这样打,如果以我对函数体的理解来看,这个  
                                                                                     //                   {}中间的内容好象不匹配啊,所以不明白。
/*sum.c*/
int sum(int, int);

#ifdef _cplusplus
}

#endif           /*_cplusplus*/
#endif           /*SUM_H*/

论坛徽章:
0
2 [报告]
发表于 2007-12-18 21:54 |只看该作者
它们之间的连接问题主要是因为c c++编绎器对函数名译码的方式不能所引起的,考虑下面两个函数
/* c*/
int strlen(char* string)
{
...
}

//c++
int strlen(char* string)
{
...
}

两个函数完全一样。在c在函数是通过函数名来识别的,而在C++中,由于存在函数的重载问题,函数的识别方式通函数名,函数的返回类型,函数参数列表三者组合来完成的。因此上面两个相同的函数,经过C,C++编绎后会产生完全不同的名字。所以,如果把一个用c编绎器编绎的目标代码和一个用C++编绎器编绎的目标代码进行连接,就会出现连接失败的错误。

解决的方法是使用extern C,避免C++编绎器按照C++的方式去编绎C函数
在头文件中定义:
extern "C" int strlen(char* string)

extern "C"
{
int strlen(char* string)
}
当C编绎器遇到extern "C"的时候就用传统的C函数编译方法对该函数进行编译。由于C编绎器不认识extern "C"这个编绎指令,而程序员又希望C,C++程序能共用这个头文件,因此通常在头文件中使用_cplusplus宏进行区分:
#if define _cplusplus
extern "C"{
#endif
int strlen(char* string)
#ifdefine _cplusplus
}
#endif

论坛徽章:
0
3 [报告]
发表于 2007-12-19 08:40 |只看该作者
学习了,呵呵

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2007-12-19 09:09 |只看该作者
把 C 和 C++ 混在一起用可不是什么好主意。

论坛徽章:
0
5 [报告]
发表于 2007-12-19 17:21 |只看该作者
有些地方是用一个宏定义来处理这个问题

sys/cdefs.h
#if defined(__cplusplus)
#define __BEGIN_DECLS   extern "C" {
#define __END_DECLS     }
#else
#define __BEGIN_DECLS
#define __END_DECLS
#endif


stdio.h
__BEGIN_DECLS
/*
* Functions defined in ANSI C standard.
*/
void     clearerr(FILE *);
int      fclose(FILE *);
int      feof(FILE *);
int      ferror(FILE *);
int      fflush(FILE *);
int      fgetc(FILE *);
/* ...... */

__END_DECLS
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP