写程序时经常会遇到C++调用C库以及 C调用C++库的情况,也就是C, C++混合编程的问题.
   由于C和C++编译器对函数解析不同,今天用空专门对这个问提小结了一下.
 
主要参考了以下文章, 很多内容也是直接copy 过来的:
 
1. 静云谷 关于extern "C":
 
2. 探索C++的秘密之详解extern "C" http://tech.163.com/06/0118/09/27O66HCC0009159Q.html
 
3. C++中extern “C”含义深层探索:
 
C++ 调用 C 函数
 
这种情况相对简单,有两种方法:
 
1.  在标准 C 头文件里加入以下 code, c++ link 的时候就会知道要link C格式的函数.
 
#ifdef  __cplusplus
extern "C" {
#endif
 
/**** some declaration or so *****/
 
#ifdef  __cplusplus
    }
#endif  /* end of __cplusplus */
 
example :首先假设有下面这样三个文件:
 
/* file: test_extern_c.h */
#ifndef __TEST_EXTERN_C_H__
#define __TEST_EXTERN_C_H__
 
#ifdef  __cplusplus
extern "C" {
#endif
 
/*
 * this is a test function, which calculate
 * the multiply of a and b.
 */
extern int ThisIsTest(int a, int b);
 
#ifdef  __cplusplus
    }
#endif  /* end of __cplusplus */
 
#endif
 
在这个头文件中只定义了一个函数,ThisIsTest()。这个函数被定义为一个外部函数,可以被包括到其它程序文件中。假设ThisIsTest()函数的实现位于test_extern_c.c文件中:
 
/* test_extern_c.c */
#include "test_extern_c.h"
 
int
ThisIsTest(int a, int b)
{
    return (a + b);
}
 
可以看到,ThisIsTest()函数的实现非常简单,就是将两个参数的相加结果返回而已。现在,假设要从CPP中调用ThisIsTest()函数:
 
/* main.cpp */
#include "test_extern_c.h"
#include <stdio.h>
#include <stdlib.h>
 
class FOO {
    public:
        int bar(int a, int b)
        {
            printf("result=%i\n", ThisIsTest(a, b));
        }
};
 
int
main(int argc, char **argv)
{
    int a = atoi(argv[1]);
    int b = atoi(argv[2]);
 
    FOO *foo = new FOO();
    foo->bar(a, b);
    return(0);
}
 
在这个CPP源文件中,定义了一个简单的类FOO,在其成员函数bar()中调用了ThisIsTest()函数。下面看一下如果采用gcc编译test_extern_c.c,而采用g++编译main.cpp并与test_extern_c.o连接会发生什么情况:
 
[cyc@cyc src]$ gcc -c test_extern_c.c
[cyc@cyc src]$ g++ main.cpp test_extern_c.o
[cyc@cyc src]$ ./a.out 4 5                
result=9
 
 
2. 直接在c++文件中这样引用c 头文件:
extern "C"
{
#include "f.h"
}
 
 
 
C 调用 C++ 函数:
 
在标准 C++ 头文件里加入以下 code, c++ link 的时候就会知道要link C格式的函数.
 
#ifdef  __cplusplus
extern "C" {
#endif
 
/**** some declaration or so *****/
 
#ifdef  __cplusplus
    }
#endif  /* end of __cplusplus */
 
example1:
//C++头文件 cppExample.h
#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H
extern "C" int add( int x, int y );
#endif

//C++实现文件 cppExample.cpp
#include "cppExample.h"
int add( int x, int y )
{
return x + y;
}

/* C实现文件 cFile.c
/* 这样会编译出错:#include "cExample.h" */
extern int add( int x, int y );
int main( int argc, char* argv[] )
{
add( 2, 3 );
return 0;
}
 
note: 如果 cppEample.h 改成:
#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H
 
#ifdef  __cplusplus
extern "C" {
#endif

int add( int x, int y );
#ifdef __cplusplus
}
#endif

#endif
 
则在 C 文件中 #include "cExample.h" 就不会报错了.
 
总之, 无论写 c 还是 c++头文件,只要是想以后混合编程,就最好加上
 
#ifdef  __cplusplus
extern "C" {
#endif
 
/**** some declaration or so *****/
 
#ifdef  __cplusplus
    }
#endif  /* end of __cplusplus */
 
可以增强代码的可移植性.