Mix C Cpp:修订间差异
来自Ubuntu中文
跳到导航跳到搜索
Dbzhang800(留言 | 贡献) 小无编辑摘要 |
Dbzhang800(留言 | 贡献) |
||
第5行: | 第5行: | ||
==C++调用C函数== | ==C++调用C函数== | ||
下面是 C++ 程序调用 C 函数 csayhello() 的一个例子。由于该函数在 C++ 程序内声明时使用了 extern "C",故调用可以直接进行: | |||
/* cpp2c.cpp */ | |||
#include <iostream> | |||
extern "C" void csayhello(char *str); | |||
int main(int argc,char *argv[]) | |||
{ | |||
csayhello("Hello from cpp to c"); | |||
return(0); | |||
} | |||
C 函数不需任何特殊处理,其代码如下: | |||
/* csayhello.c */ | |||
#include <stdio.h> | |||
void csayhello(char *str) | |||
{ | |||
printf("%s\n",str); | |||
} | |||
下面三条命令编译以上两个文件并将二者链接为一个可执行文件。由于 gcc 和 g++ 的灵活性使得存在很多方法来完成该任务,但这三条命令或许是最常用的: | |||
$ g++ -c cpp2c.cpp -o cpp2c.o | |||
$ gcc -c csayhello.c -o csayhello.o | |||
$ gcc cpp2c.o csayhello.o -lstdc++ -o cpp2c | |||
注意到,在最后链接的时候指定 C++ 标准库是必须的,这是因为我们用的是 gcc 而不是 g++ 调用的链接器。如果使用的是 g++ 的话,C++ 标准库默认会被链接。 | |||
最普遍的做法是,将函数声明放到头文件中,然后将所有内容包含在 extern "C" 声明块内。文件内容像下面所示: | |||
extern "C" { | |||
int mlimitav(int lowend, int highend); | |||
void updatedesc(char *newdesc); | |||
double getpct(char *name); | |||
}; | |||
==C调用C++函数== | ==C调用C++函数== |
2008年3月27日 (四) 16:41的版本
C与C++混合编程
C++ 是在 C 语言的基础上发展起来的。在某种程度上,我们可将 C++ 看做 C 的一种扩展。在本质上,二者的数据类型和函数调用惯例都是一致的,因此 C 与 C++ 混合编译也是很自然的事情。
二者的区别仅在于编译后函数的名字不同──C 简单地使用函数名而不考虑参数的个数或类型,而 C++ 编译后的函数名则总是将参数类型列表作为其一部分。尽管如此,C++ 提供了特殊的机制来声明 C 函数,这意味着一个 C++ 程序可以直接声明和调用 C 函数。
C++调用C函数
下面是 C++ 程序调用 C 函数 csayhello() 的一个例子。由于该函数在 C++ 程序内声明时使用了 extern "C",故调用可以直接进行:
/* cpp2c.cpp */ #include <iostream> extern "C" void csayhello(char *str); int main(int argc,char *argv[]) { csayhello("Hello from cpp to c"); return(0); } C 函数不需任何特殊处理,其代码如下:
/* csayhello.c */ #include <stdio.h> void csayhello(char *str) { printf("%s\n",str); }
下面三条命令编译以上两个文件并将二者链接为一个可执行文件。由于 gcc 和 g++ 的灵活性使得存在很多方法来完成该任务,但这三条命令或许是最常用的:
$ g++ -c cpp2c.cpp -o cpp2c.o $ gcc -c csayhello.c -o csayhello.o $ gcc cpp2c.o csayhello.o -lstdc++ -o cpp2c
注意到,在最后链接的时候指定 C++ 标准库是必须的,这是因为我们用的是 gcc 而不是 g++ 调用的链接器。如果使用的是 g++ 的话,C++ 标准库默认会被链接。
最普遍的做法是,将函数声明放到头文件中,然后将所有内容包含在 extern "C" 声明块内。文件内容像下面所示:
extern "C" { int mlimitav(int lowend, int highend); void updatedesc(char *newdesc); double getpct(char *name); };