C调用C++函数的问题。。。

C、C++和Java语言
回复
绿色植物
帖子: 35
注册时间: 2008-12-22 19:40
送出感谢: 0
接收感谢: 0

C调用C++函数的问题。。。

#1

帖子 绿色植物 » 2008-12-24 15:03

首先引用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单独编译的吗???
头像
xhy
帖子: 3916
注册时间: 2005-12-28 1:16
系统: Ubuntu 12.10 X64
来自: 火星
送出感谢: 1 次
接收感谢: 0

Re: C调用C++函数的问题。。。

#2

帖子 xhy » 2008-12-24 17:52

extern "C"不是用来声明调用C函数的
仅仅用于指示连接约定,fortran也遵循C调用方式
对于调用方式相同的情况,声明或者不声明都是没问题的
目前负债150多万
头像
lyre
帖子: 77
注册时间: 2005-06-28 18:08
送出感谢: 0
接收感谢: 0

Re: C调用C++函数的问题。。。

#3

帖子 lyre » 2009-01-18 1:11

代码: 全选

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的输出结果
头像
pentie
帖子: 228
注册时间: 2007-08-27 22:03
来自: http://apt-blog.co.cc/
送出感谢: 0
接收感谢: 0

Re: C调用C++函数的问题。。。

#4

帖子 pentie » 2009-01-18 2:24

准确的方法是:
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来说就相当于一个静态库, 链接后就可以用了.

上面的做法是标准一些, 不让编译器抱怨
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
送出感谢: 0
接收感谢: 7 次
联系:

Re: C调用C++函数的问题。。。

#5

帖子 BigSnake.NET » 2009-01-18 9:49

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++ 不允许
^_^ ~~~
要理解递归,首先要理解递归。

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

回到 “C/C++/Java”