C++程序的C语言接口

来源:互联网 发布:孙鑫的java视频教程 编辑:程序博客网 时间:2024/06/14 05:26

有时候我们得到一个C++库,但却要在C语言中使用该库中的函数,或者想编一个在C语言下也容易使用的C++库。

首先我们写两个文件,分别是foo.cpp和main.c,

先看main.c

void g(void);

int
 main()
{
    g();
    
return 0
;
}

只是简单声明了函数g(),再在main()中调用。

g() 在foo.cpp中定义

#include <iostream>
using namespace std;

class Foo {
    
int
 i;
public
:
    Foo(
int i = 0
);
    
void
 print();
};

Foo::Foo(
int
 i) : i(i) {}
void
 Foo::print()
{
       cout 
<< "Foo " << i <<
 endl; 
}

extern 
"C"
 {
void g(void
)
{
    Foo foo;
    foo.print();
}
}

定义了一个类Foo,在g()中实例化了一个foo,使用print()方法打印一些信息。

我们所要作的就是在g()函数外加上extern "C" {和},这样C++编译器在编译g()的时候会以C语言的方式来生成g()的内部名,这样连接器才能在C语言目标代码中找到g()的引用。

在GCC下编译:

gcc -c main.c
g
++ -c foo.
cpp
g
++ main.o foo.o

在MSVC中编译

cl foo.cpp main.c

 


 

上面foo.cpp中的g()声明和定义是在一块儿的,其实只要在函数声明上加上extern "C"就行了,所以我们可以把声明提取到一个头文件foo.h中去。

foo.h

#ifndef FOO_H
#define FOO_H

#ifdef  __cplusplus
extern 
"C"
 {
#endif

void g(void
);

#ifdef  __cplusplus
}
#endif
#endif 
/* FOO_H */

foo.cpp

#include "foo.h"
#include 
<iostream>
using namespace std;

class Foo {
    
int
 i;
public
:
    Foo(
int i = 0
);
    
void
 print();
};

Foo::Foo(
int
 i) : i(i) {}
void
 Foo::print()
{
       cout 
<< "Foo " << i <<
 endl; 
}

void g(void
)
{
    Foo foo;
    foo.print();
}

main.c

#include "foo.h"

int main()
{
    g();
    
return 0
;
}