cpputest单元测试工具是由c++编写,用于c/c++单元测试,当对c进行单元测试时,涉及到混合编程。本文主要介绍c和c++混合编程的方法。
1. extern "C"
- •
extern "C"是C++特性,C编译器不识别。 - • 核心作用是让C++编译器按照C语言的规则编译和链接被它包裹的代码。解决混合编程时的链接兼容性问题。
- •
extern "C"只能修饰函数和函数指针,不能修饰类、模板、重载函数。 - • 在c文件中使用的话必须用
__cplusplus宏做条件编译。
2. __cplusplus宏
- •
__cplusplus是C++编译器预定义的宏,用来区分C/C++编译环境,C编译器不会定义它; - • 核心用途是编写兼容
C/C++的代码,如搭配extern "C"使用。
例如下面的头文件既能被C编译器编译,也能被C++编译器编译:
// common.h#ifndef __COMMON_H__#define __COMMON_H__#ifdef __cplusplusextern "C" { // 开启 C 链接规则#endif// 声明函数(C/C++ 均可调用)int add(int a, int b);#ifdef __cplusplus} // 闭合 extern "C"#endif#endif
- • 用
C++编译器编译时,__cplusplus存在,extern "C"生效,函数按C 规则链接; - • 用
C编译器编译时,__cplusplus不存在,extern "C"被跳过,避免C编译器识别不了这个C++特性而报错。
3. c++中调用c函数的例子
// add.c#include <stdio.h>#include "add.h"int add(int a, int b){ printf("a + b = %d", a + b); return a + b;}// add.h#ifndef __ADD_H__#define __ADD_H__int add(int a, int b);#endif
在main.cpp中使用extern "C" 声明c函数。
// main.cpp// 告诉 C++ 编译器:这个头文件中包含的函数按 C 规则链接extern "C" {#include "add.h"}int main(){ int num = add(1, 2); return 0;}
编译和链接main.cpp和add.c
gcc -Wall -c add.cg++ -Wall -c main.cppg++ main.o add.o -o test
4. 头文件兼容 C/C++ 编译的例子
只需将main.cpp中的extern "C"去除,然后放在add.h中,同时使用__cplusplus宏包裹即可。
// add.h#ifndef __ADD_H__#define __ADD_H__#ifdef __cplusplusextern "C" {#endifint add(int a, int b);#ifdef __cplusplus}#endif#endif