免费注册 查看新帖 |

Chinaunix

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

[C++] 问个C++中调用C的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-26 17:43 |只看该作者 |倒序浏览
//C文件 c.c
#include<stdio.h>
void C_fun()
{
    printf("Hello, this is a C programme!\n");
}

//头文件  c.h
#ifndef _c_h_
#define _c_h_
extern "C" void C_fun();

#endif

//C++文件  main.C

#include "c.h"
int main()
{
    C_fun();
    return 0;
}

编译会出错,不知道为什么
若将c.h中的extern "C" void C_fun();改为extern void C_fun();
main.C中的#include "c.h"改为extern "C" {#include "c.h"}
则可以对!
不解,问下原因,谢谢

论坛徽章:
0
2 [报告]
发表于 2007-09-26 18:35 |只看该作者
你的前一种方式是没有任何问题的,后一种方式实际上是前一种方式预编译之后的格式。 extern "C" 是给C++编译器看的, 所以一般原则是:
(1) extern "C" 不要出现在.c文件中, 所以.h中函数申明部分有如下格式:
#ifdef __cplusplus
extern "C"
{
#endef

function declare list

#ifdef __cplusplus
}
#endef

(2) 用c编译器编译.c
(3) 用c++编译器编译.cpp

[ 本帖最后由 web_surf 于 2007-9-26 18:40 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-09-27 09:04 |只看该作者
呵呵,谢谢楼上.你的这种方式我试过,用_cplusplus宏来判断预编译可以.
但是这种方式和我所写的两种都不一样,我的第一种方式是不行的,编译会出错

论坛徽章:
0
4 [报告]
发表于 2007-09-27 09:21 |只看该作者
原帖由 panz1983 于 2007-9-27 09:04 发表
呵呵,谢谢楼上.你的这种方式我试过,用_cplusplus宏来判断预编译可以.
但是这种方式和我所写的两种都不一样,我的第一种方式是不行的,编译会出错


说说有什么不一样? 用__cplusplus的目的只是防止extern "C" 出现在.c包含的头文件中; 也就是说,如果你这个头文件不被.c包含,有没有__cplusplus判断都是一样的。

论坛徽章:
0
5 [报告]
发表于 2007-09-27 14:14 |只看该作者
原帖由 web_surf 于 2007-9-27 09:21 发表


说说有什么不一样? 用__cplusplus的目的只是防止extern "C" 出现在.c包含的头文件中; 也就是说,如果你这个头文件不被.c包含,有没有__cplusplus判断都是一样的。


第一个程序extern "C" 出现在.cpp包含的头文件中,并没有出现在.c包含的头文件中
是不是程序里头文件中不能直接出现extern "C" fun();的形式
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP