怎样混合c和c++
作者:网络转载 发布时间:[ 2012/8/7 14:52:44 ] 推荐标签:
<SMALL><SMALL>(Part of <A title="C++ FAQ" href="http://www.parashift.com/c++-faq-lite/index.html"><EM>C++ FAQ</EM></A>, <A title="[1.2] Copyright Notice" href="http://www.parashift.com/c++-faq-lite/copy-permissions.html#faq-1.2">Copyright © 1991-2011</A>, <A title=www.parashift.com/ href="http://www.parashift.com/" target=_blank>Marshall Cline</A>, <Atitle=cline@parashift.comhref="mailto:cline@parashift.com"><TT>cline@parashift.com</TT></A>)</SMALL></SMALL><HR>
1、当混合c和c++代码时我要注意什么?
这里列出了一些重点(但是一些编译器可能不需要遵循全部内容,以阅读你的编译器文档)
● 必须使用c++编译器编译main()(也是静态初始化要用c++编译器编译)
● c++编译器应该执行链接(link)过程(这样它可以拿到它特殊的库文件)
● c和c++编译器可能需要出自相同的供应商和兼容的版本(这样它们有相同的调用规范)
另外,请阅读下面的几节以明白c的函数怎样被c++调用和c++函数怎样被c调用
顺便提一下,有另一种方法处理这些事情:使用c++编译器编译你全部的代码,即便是c风格的代码。这样可以很优雅的消除混合c和c++的需要,也会使你对于你的c风格的代码更加小心(可能,希望,会发现一些c风格代码中的bug)。不好的地方是你需要用某种方式更新你的c风格代码,主要是因为c++编译器比c编译器更加仔细和挑剔。主要要看清理你的c风格代码的工作量是否小于混合c和c++代码的工作量,并且你能得到一个红利是你有了更干净的c风格代码。但是,如果你无法改变你的c风格代码(例如,它们来自第三方),很明显你没有太多的选择了。
2、怎么样在c++代码中包含(include)c的标准头文件
包含一个标准的头文件(例如<cstdio>),你不需要做任何特殊的事情:
// This is C++ code
#include <cstdio> // Nothing unusual in #include line
int main()
{
std::printf("Hello world
"); // Nothing unusual in the call either
...
}
如果你认为std::printf()中的std::是一种不平常的调用,你好“克服”一下。换句话说,在标准库中使用名字是一种标准的做法,所以你好从现在习惯它。
但是,如果你正用c++编译器编译c的代码,你不必苦恼的将所有printf()改成std::printf()。幸运的是在这种情况下c代码将使用旧风格的头文件<stdio.h>,而不是新风格的头文件<cstdio>,namespace会处理其它的所有事情:
/* This is C code that I'm compiling using a C++ compiler */
#include <stdio.h> /* Nothing unusual in #include line */
int main()
{
printf("Hello world
"); /* Nothing unusual in the call either */
...
}
后一个建议,如果你的c头文件不是标准的,我们会有不同的建议。有两种情况,你不能改变该头文件,或者你能改变该头文件。
3、我怎么在c++代码中包含(include)非系统的c头文件
如果你要包含一个不是有系统提供的c的头文件,你可能需要将#include行包含在extern "C" { /* ... */}结构中。这会告诉c++编译器在这个头文件中声明的函数是c函数。
// This is C++ code
extern "C" {
// Get declaration for f(int i, char c, float x)
#include "my-C-code.h"
}
int main()
{
f(7, 'x', 3.14); // Note: nothing unusual in the call
...
}
4、我应该怎样改变自己的c头文件使它们可以更简单的包含进c++代码中
如果你要包含一个不是由系统提供的c头文件,并且你能修改这个c头文件,你应该考虑在头文件中添加extern "C" {...}使它更容易被c++用户包含进c++代码中。因为c编译器不理解extern "C",所以你必须把extern "C"包含进#ifdef,这样它们不会被一般的c编译器看到。
步骤一:将下列行放进c头文件的上方(注意:符号__cplusplus当且仅当编译器是c++编译器时才会被定义):
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11