#ifdef __cplusplus extern C{}与C和C++间的关系

1.1 问题是什么

        解决在 1.在一个系统中.cpp文件的函数需要调用.c文件的函数,及需要gcc和g++编译的文件或文件的部分函数在同一个头文件中。

        的情况下,如何正确的编译、链接。

1.2 基础知识

    Compile the C code like this:

    gcc -c -o somecode.o somecode.c

    Then the C++ code like this:

    g++ -c -o othercode.o othercode.cpp

    Then link them together, with the C++ linker:

    g++ -o yourprogram somecode.o othercode.o

You also have to tell the C++ compiler a C header is coming when you include the declaration for the C function. 

在Linux中.c/.cpp文件分别使用不同的编译方式进行编译,但因为c语言先于c++问世,所以g++的编译、链接兼容.c/.cpp文件;而gcc编译不支持c++函数重定义语法。使用g++编译.c文件时需要通知它,某文件xx.h(xx.h中声明的函数都定义在xx.c文件中)需要gcc编译的或者某文件的某部分需要gcc编译。

1.如果一个project中有.c/.cpp两种文件,那么.c(gcc)/.cpp(g++)分开编译之后使用g++进行链接;

2.如果一个project中的.cpp调用的头文件中含有需要gcc编译的部分,那么需要使用extern “C”{}配合g++编译、链接


1.3 解决问题的原理

    1.__cplusplus是g++编译器中自动默认定义过了,用于说明正在使用g++编译;(也可以在Makefile中重新宏定义 -D cplusplus xx)

    2.extern C” {}的大括号内的code,g++默认识别为需要使用gcc编译。

    综合这两点就可以完全的解决1.1中的问题。

#main.h 

#ifdef __cplusplus
    extern "C" {
#endif

c_function();//需要gcc编译的函数

#ifdef __cplusplus
    }
#endif

这样就可以将c_function()函数放入.cpp文件中,使用g++编译该.cpp,c_function()会被按照c语言的语法进行编译。

1.4 参考链接: http://stackoverflow.com/questions/16850992/call-a-c-function-from-c-code?lq=1

               http://stackoverflow.com/questions/3789340/combining-c-and-c-how-does-ifdef-cplusplus-work