C和C++混合编译初步
来源:互联网 发布:鹰眼数据监控 编辑:程序博客网 时间:2024/05/17 07:13
Mix C Cpp
目录
[隐藏]- 1 C与C++混合编程
- 2 C++调用C函数
- 3 C调用C++函数
- 4 其他参考
[编辑]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);};
[编辑]C调用C++函数
要使 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++ 函数并相应地更改函数名。
下面是调用 C++ 函数 cppsayhello() 的 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
http://wiki.ubuntu.org.cn/index.php?title=Mix_C_Cpp&variant=zh-cn
- C和C++混合编译初步
- C和Fortran混合编译初步
- C和C++混合编译
- C和C++混合编译
- C和C++混合编译
- C和C++混合编译
- C和C++混合编译
- C和C++混合编译
- c和C++混合编译
- c和c++文件混合编译
- c++ 和c的混合编译
- 如何混合编译C语言和C++
- C和C++文件混合编译
- c/cpp混合编译
- c和c++混合编译的问题(extern "C")
- c和c++混合编译的问题(extern "C")
- c 和 c ++ 混合代码 cmath编译出错
- GCC编译C C++ 和C混合C++
- Fortran编译初步
- POJ1656 Counting Black [简单暴力]
- linux vi文本处理器(模式转换,常用命令)
- 路径规划算法总结初版
- JS取当前时间
- C和C++混合编译初步
- 模式
- Emulator Error Message - ".NET Compact Framework v2.0 could not be found."
- DataGridView删除一行数据
- Android开机运行,替换系统launch
- C和Fortran混合编译初步
- 一种基于 桌面截图的 透明窗体的实现1(理论)
- 分布式服务框架 Zookeeper -- 管理分布式环境中的数据
- ssh登陆之忽略known_hosts文件