我有一段从 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);

10-07 14:05