查看“Mix C Cpp”的源代码
来自Ubuntu中文
←
Mix C Cpp
跳到导航
跳到搜索
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
==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 ==其他参考== {{Gccmorerefer}}
该页面使用的模板:
模板:Gccmorerefer
(
查看源代码
)
返回
Mix C Cpp
。
导航菜单
页面操作
页面
讨论
阅读
查看源代码
历史
页面操作
页面
讨论
更多
工具
个人工具
登录
导航
首页
最近更改
随机页面
页面分类
帮助
搜索
编辑
编辑指南
沙盒
新闻动态
字词处理
工具
链入页面
相关更改
特殊页面
页面信息