gpt4 book ai didi

c++ - 如何通过对C函数和类对象的外部调用来处理C++头文件

转载 作者:行者123 更新时间:2023-12-02 09:55:41 28 4
gpt4 key购买 nike

我正在尝试编译涉及C和C++文件的应用程序。使用一个特定的 header ,我遇到了问题。有问题的文件(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编译器编译此 header 时,出现以下错误: "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

    注意:在任何C文件中都不会调用 MyCCPObject
    因此,当我有一个C++头文件时,有什么更好的方法呢?
  • 函数将涉及一个类对象
  • C文件的extern调用
  • 最佳答案

    C++的开发者编写了FAQ,它也为how to mix C and C++提供了一些指导。他们也在研究use C++ objects from C code的可能性。

    选项1 :如果只希望C编译器能够解析task.h头文件,则可以使用#ifdef __cplusplus隐藏C++部分:

    #ifndef TASK_H
    #define TASK_H

    #ifdef __cplusplus
    #include "MyCCPObject.h"

    int foo1(int);
    int foo2(int);
    int fooObject(MyCCPObject myCppObject); // Function involves a Class "MyCCPObject" type

    extern "C" {
    #endif
    int foo3(void); // Function called in a C file
    #ifdef __cplusplus
    }
    #endif

    #endif //TASK_H

    选项2 :如果要使 fooObject函数可从C访问,则可以更改MyCppObject.h以向C++提供完整的类信息,而仅向C提供最小的 typedeftypedef确保C只能理解该类。命名 MyCCPObject而不先写 classstruct
    #ifdef __cplusplus
    class MyCCPObject
    {
    public:
    MyCCPObject(uint32_t val);
    private:
    uint32_t value;

    };
    #else
    typedef struct MyCCPObject MyCCPObject;
    #endif

    和task.h
    #ifndef TASK_H
    #define TASK_H

    #include "MyCCPObject.h"

    int foo1(int);
    int foo2(int);

    #ifdef __cplusplus
    extern "C" {
    #endif
    int fooObject(MyCCPObject *myCppObject); // Function involves a Class "MyCCPObject" type
    int foo3(void); // Function called in a C file
    #ifdef __cplusplus
    }
    #endif

    #endif //TASK_H

    请注意,我需要更改 fooObject的签名以获取指向该对象的指针,因为C代码看不到完整的类,也不知道对象的大小。

    关于c++ - 如何通过对C函数和类对象的外部调用来处理C++头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60307534/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com