c++文件中引用C代码

时间:2022-04-17 17:12:35

下面提供一个比较完整的示例程序,一共有四个文件:main.cpp、test.c、test.h、test.hpp

main.cpp

#include "test.hpp"

int main()
{
fun();  //相当于在公共命名空间 return ;
}

test.hpp

#ifndef _TEST_HPP_
#define _TEST_HPP_ #ifndef __cplusplus
#error Do not include the hpp header in a c project!
#endif //__cplusplus extern "C" {
#include "test.h"
} #endif //_TEST_HPP_

test.c

#include <stdio.h>
#include "test.h" void fun(void)
{
printf("test...\n"); return ;
}

test.h

#ifndef _TEST_H_
#define _TEST_H_ void fun(void); #endif

上边所示程序不能直接用 g++ 编译,因为 g++ 在编译 test.c 时候函数 fun 由于没加 extern ”C“ {},所以编译时候会给 fun() 按照C++编译规则生成符号表,在main中调用时候,按照 C 的符号来找,就会找不到这个函数,

正确的编译步骤是,先将 C, cpp 文件编译成 .o ,然后通过 g++ 将两个文件链接起来。

$ gcc -c test.c -o test.o

$ g++ -c main.cpp -o main

$ g++ main.o test.o -o test

$ ./test
test...

所以C++中调用C应该有一个统一的格式,即是在什么位置加 extern "C" {}

上边的那种形式,将 test.h 用 test.hpp 封装起来,但是在 test.c 中没有加 external "C" {} ,所以需要先将 C 文件编译成.o,或者库的形式来调用。

还有另一种形式就是,在所有C文件中,都加上

#ifdef __cplusplus

external "C" {

#endif  //__cplusplus

    /*   code     */

#ifdef __cplusplus

}

#endif  //__cplusplus

这样的话,可以用 g++ 正常编译 C 程序,C程序就相当于在公共命名空间声明的C++,当C++公共命名空间中有跟C中的函数完全一样的(名称,参数,返回值都一样)函数的时候,此时g++编译器不会重载,会报错

函数重复定义。