之前学习了C与C++混合编程问题总结,下面着重学习一下在C++/C项目中使用C/C++源文件。
在C++项目中,包含C源文件的.h文件会因为C和C++的标准不同而导致很多错误。 如何在 C++/C 项目中使用 C /C++源文件?
1.C++ 项目中调用C
C++ 调用 C 非常简单:每个 C 函数只有一个可能的非混淆符号,因此不需要额外的工作。
main.cpp
文件
#include <cassert>
#include "c.h"
int main() {
assert(f() == 1);
}
c.h
文件
#ifndef C_H
#define C_H
/* 这个 ifdef 允许C 和 C++ 使用头文件。*/
#ifdef __cplusplus
extern "C" {
#endif
int f();
#ifdef __cplusplus
}
#endif
#endif
c.c
文件
#include "c.h"
int f() { return 1; }
- 运行
g++ -c -o main.o -std=c++98 main.cpp
gcc -c -o c.o -std=c89 c.c
g++ -o main.out main.o c.o
./main.out
2.C项目中调用C++
调用c++ from有点困难:我们必须手动创建要公开的每个函数的未被破坏的版本。
这里我们说明如何向 C 公开 C++ 函数重载。
- main.c文件
#include <assert.h>
#include "cpp.h"
int main(void) {
assert(f_int(1) == 2);
assert(f_float(1.0) == 3);
return 0;
}
- cpp.h文件
#ifndef CPP_H
#define CPP_H
#ifdef __cplusplus
// C cannot see these overloaded prototypes, or else it would get confused.
int f(int i);
int f(float i);
extern "C" {
#endif
int f_int(int i);
int f_float(float i);
#ifdef __cplusplus
}
#endif
#endif
- cpp.cpp文件
#include "cpp.h"
int f(int i) {
return i + 1;
}
int f(float i) {
return i + 2;
}
int f_int(int i) {
return f(i);
}
int f_float(float i) {
return f(i);
}
- 运行
gcc -c -o main.o -std=c89 -Wextra main.c
g++ -c -o cpp.o -std=c++98 cpp.cpp
g++ -o main.out main.o cpp.o
./main.out