结论
当C语言 需要调用C++函数接口(比如func.h,func.cpp)时,func.h中不能出现c++特有的class定义或头文件包含。即:关于class的定义或含有class的头文件包含必须放在源文件中(如func.cpp中),不能放在头文件(func.h,无论是extern “C” 里还是exter "C"外)中
一个小bug卡了好多天。。特此记录。。。
证明
main.c代码如下:
#include <stdio.h>
#include "func.h"
typedef unsigned char UINT8;
int main(){
printf("result=%d\n",add(2,3,2));
printf("result=%d\n", add(2, 3,1));
char buf[] = "hello";
printf("%d\n",str(buf));
UINT8 payload[100];
refillDataForTteEnd( payload);
system("pause");
return 0;
}
func.h代码如下:
#ifndef __FUNC__
#define __FUNC__
//class A{ //class A的定义放在func.h中编译会报错(无论放在extern "C"之外还是extern "C"之内都汇报错),放在func.cpp中可以正常。包含含有class定义的头文件同理。
//public:
// int a;
//};
#ifdef __cplusplus //告诉编译器,这部分代码按C语言的格式进行编译,而不是C++的
extern "C"{
#endif
int add(int a, int b, int flag);
int str(char* buf);
typedef unsigned char UINT8;
void refillDataForTteEnd(UINT8* payload);
#ifdef __cplusplus
}
#endif
#endif
func.cpp代码如下:
```cpp
#include <iostream>
#include "func.h"
#include "overload.h"
class A{
public:
int a;
};
int add(int a, int b,int flag){
std::cout << "int add()" << std::endl;
std::cout << __cplusplus << std::endl;
A h;
h.a = 23;
std::cout << "h,a = " << h.a << std::endl;
if (flag == 1){
return addnum(a, b);
}
else{
return addnum(a, b, flag);
}
}
int str(char* buf){
return strlen(buf);
}
void refillDataForTteEnd(UINT8* payload) {
A h;
h.a = 23;
std::cout << "refillDataForTteEnd " << h.a << std::endl;
}