我有一段从 C++ 函数中使用的 C 代码。在我的 C++ 文件的顶部,我有一行:#include "prediction.h"
在 prediction.h
我有这个:
#ifndef prediction
#define prediction
#include "structs.h"
typedef struct {
double estimation;
double variance;
} response;
response runPrediction(int obs, location* positions, double* observations,
int targets, location* targetPositions);
#endif
我也有
prediction.c
,它有:#include "prediction.h"
response runPrediction(int obs, location* positions, double* observations,
int targets, location* targetPositions) {
// code here
}
现在,在我的 C++ 文件中(正如我所说,它包括预测.h)我调用了那个函数,然后编译(通过 Xcode)我得到这个错误:
predict.c 被标记为编译当前目标。我对未编译的其他 .cpp 文件没有任何问题。这里有什么想法吗?
最佳答案
该函数的名称可能是 mangled *。您需要执行以下操作:
extern "C" response runPrediction(int obs, location* positions,
double* observations, int targets, location* targetPositions);
这告诉它把它当作一个 C 函数声明。
*C++ 在链接阶段修改函数名称以赋予它们唯一的名称,用于函数重载。 C 没有函数重载,所以没有这样的事情。
只是你知道,如果你有很多东西要外部,你也可以制作一个
extern "C"
块:extern "C"
{
response runPrediction(int obs, location* positions,
double* observations, int targets, location* targetPositions);
// other stuff
}
就像 Paul 建议的那样,要允许在两者中使用 header ,请使用
__cplusplus
来调节它:#ifdef __cplusplus
#define EXTERN_C extern "C"
#else
#define EXTERN_C
#endif
EXTERN_C response runPrediction(int obs, location* positions,
double* observations, int targets, location* targetPositions);