当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 5 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : C调用C++函数的问题。。。
帖子发表于 : 2008-12-24 15:03 

注册: 2008-12-22 19:40
帖子: 35
送出感谢: 0 次
接收感谢: 0 次
首先引用wiki中的程序:
-----------------------引用---------------------------
要使 C 程序能够调用 C++ 中函数的话,C++ 提供一个符合 C 调用惯例的函数是必须的。下面的例子演示了在 C++ 内创建 C 函数的语法:
/* cppsayhello.cpp */
#include <iostream>
extern "C" void cppsayhello(char *str);
void cppsayhello(char *str)
{
std::cout << str << "\n";
}

尽管函数 cppsayhello() 通过 extern "C" 声明为 C 函数,事实上它是 C++ 源代码的一部分,这意味着函数体内是真正的 C++ 代码。在函数内你可以自由地创建和析构对象。如果你要在 cppsayhello() 内调用 C 函数的话,将其声明为 extern "C" 是必须的。否则,编译器会将作为一个 C++ 函数并相应地更改函数名。

/* c2cpp.c */
int main(int argc,char *argv[])
{
cppsayhello("Hello from C to C++");
return(0);
}
下面的命令编译并链接生成c2cpp:
$ g++ -c cppsayhello.cpp -o cppsayhello.o
$ gcc -c c2cpp.c -o c2cpp.o
$ gcc cppsayhello.o c2cpp.o -lstdc++ -o c2cpp
---------------------引用结束--------------------------
一切顺利。
只是,我不懂,c2cpp.c编译时怎么没有错误呢? cppsayhello 没声明就直接调用了啊????
虽然他在 cppsayhello.cpp中,但是$ gcc -c c2cpp.c -o c2cpp.o不是对c2cpp.c单独编译的吗???


页首
 用户资料  
 
2 楼 
 文章标题 : Re: C调用C++函数的问题。。。
帖子发表于 : 2008-12-24 17:52 
头像

注册: 2005-12-28 1:16
帖子: 3916
地址: 火星
系统: Ubuntu 12.10 X64
送出感谢: 1
接收感谢: 0 次
extern "C"不是用来声明调用C函数的
仅仅用于指示连接约定,fortran也遵循C调用方式
对于调用方式相同的情况,声明或者不声明都是没问题的


_________________
目前负债150多万


页首
 用户资料  
 
3 楼 
 文章标题 : Re: C调用C++函数的问题。。。
帖子发表于 : 2009-01-18 1:11 
头像

注册: 2005-06-28 18:08
帖子: 77
送出感谢: 0 次
接收感谢: 0 次
代码:
longxing@lx-344e6bac80a1 ~
$ gcc -c c2cpp.c -o c2cpp.o

longxing@lx-344e6bac80a1 ~
$ gcc -c c2cpp.c -o c2cpp.o -Wall
c2cpp.c: In function `main':
c2cpp.c:5: warning: implicit declaration of function `cppsayhello'


使用-Wall选项,以上是在windows中cygwin的输出结果


页首
 用户资料  
 
4 楼 
 文章标题 : Re: C调用C++函数的问题。。。
帖子发表于 : 2009-01-18 2:24 
头像

注册: 2007-08-27 22:03
帖子: 228
地址: http://apt-blog.co.cc/
送出感谢: 0 次
接收感谢: 0 次
准确的方法是:
1.建立cppsayhello.h
/* cppsayhello.h */
extern "C"{
void cppsayhello(char *str);
}

2.在cppsayhello.cpp和c2cpp.c中都包含cppsayhello.h

3.编译方法和wiki的方法一样。



原理没什么特别的,就好像printf的主体并不在stdio.h里面, 但是引用了之后, 程序链接完了就能用;
cppsayhello.cpp编译成o文件后,对c2cpp.o来说就相当于一个静态库, 链接后就可以用了.

上面的做法是标准一些, 不让编译器抱怨


页首
 用户资料  
 
5 楼 
 文章标题 : Re: C调用C++函数的问题。。。
帖子发表于 : 2009-01-18 9:49 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
autumncat@autumncat-host:~
$ gcc -c a.c -Wall
a.c: 在函数‘main’中:
a.c:4: 警告: 隐式声明函数‘cppsayhello’
Exit status: 0
autumncat@autumncat-host:~
$ g++ -c a.c -Wall
a.c: In function ‘int main(int, char**)’:
a.c:4: 错误: ‘cppsayhello’在此作用域中尚未声明


C 允许, C++ 不允许


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 5 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译