note
不管是c代码调用c++代码,还是c++代码调用c代码,本质上都是g++兼容gcc的功能
c++代码调用c代码
lib.h
#ifndef _LIB_H_
void libfun(void);
#endif
lib.c
#include <stdio.h>
#include "lib.h"
void libfun(void) {
printf("this is in libfun\n");
}
main.hpp
#pragma once
#ifdef __cplusplus // 若当前是cpp编译器
extern "C" { // 如下是c规则的数据类型声明,函数声明
#include "lib.h" // 数据类型定义和函数声明放在头文件里了
#endif
#ifdef __cplusplus
}
#endif
main.cpp
#include "main.hpp"
int main() {
libfun();
return 0;
}
makefile
main.exe:lib.o main.o
g++ $^ -o $@
lib.o:lib.c
gcc -c $< -o $@
main.o:main.cpp
g++ -c $< -o $@
.PHONY:clean
clean:
rm -f *.o *.exe
c代码调用c++代码
fun.cpp
#include "fun.hpp"
#include <iostream>
using std::cout;
void Fun::fun(void) {
cout << "this is in Fun::fun\n"; // 不可用cout
}
void call_me(void) {
Fun f;
f.fun();
}
fun.hpp
#pragma once
class Fun {
public:
void fun(void);
};
#ifdef __cplusplus
extern "C" {
void call_me(void); // 对外声明c接口
#endif
#ifdef __cplusplus
}
#endif
main.c
extern void call_me(void);
int main(void) {
call_me();
return 0;
}
makefile
# 重点:c代码调用c++代码在链接时一定要使用g++编译器,所以本质上还是g++兼容了gcc
main.exe:fun.o main.o
g++ $^ -o $@
fun.o:fun.cpp
g++ -std=c++11 -c $< -o $@
main.o:main.c
gcc -c $< -o $@
.PHONY:clean
clean:
rm -f *.o *.exe