【发布时间】:2020-02-19 19:06:50
【问题描述】:
我正在尝试编译一个涉及 C 和 C++ 文件的应用程序。对于一个特定的标题,我遇到了问题。有问题的文件(C++ 头文件)看起来像这样:
#ifndef TASK_H
#define TASK_H
#include "MyCCPObject.h"
int foo1(int);
int foo2(int);
int fooObject(MyCCPObject myCppObject); // Function involves a Class "MyCCPObject" type
#ifdef __cplusplus
extern "C" {
#endif
int foo3(void); // Function called in a C file
#ifdef __cplusplus
}
#endif
#endif //TASK_H
我有一个函数fooObject(),它有一个MyCCPObject 类类型作为参数。此外,其中一个函数 foo3() 将从 C 文件中调用。
当 C 编译器编译此标头时,我收到以下错误:"error: #20:identifier "class" is undefined"。为了避免这种情况,我不得不:
- 将
fooObject()声明放在编译器保护中:
#ifdef __cplusplus
int fooObject(MyCCPObject myCppObject);
#endif
- 将编译器保护也放在头文件
MyCCPObject.h的类声明中:
#ifdef __cplusplus
class MyCCPObject
{
public:
MyCCPObject(uint32_t val);
private:
uint32_t value;
};
#endif
注意:MyCCPObject 不会在任何 C 文件中调用。
那么,当我有一个 C++ 头文件时,有什么更好的方法,其中涉及:
- 函数将涉及类对象
-
extern调用 C 文件
【问题讨论】:
-
有什么问题,你想达到什么目标?
-
你能列出所有文件名及其内容吗?
-
好吧,当整个应用程序被编译时,C 编译器会抛出关于“标识符”类“未定义”的错误,因为头文件包含在 C 文件中,因为“extern”调用. 为了避免这种情况,我使用了编译器保护。现在不确定这是否是正确的方法。
-
@Phalgun 在我的例子中,
task.h是有问题的包含文件。task.cpp文件是编译后的文件,但有几个方法,如fooObject(MyCCPObject),它也将使用MyCCPObject类型的对象。接下来是 C 文件,一些App.c,其中将调用函数foo3()。
标签: c++ c cross-language