&nbsp;<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&nbsp;© 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++编译器时才会被定义):