c++ - 将 C 识别的指针类型定义为内部 C++ 类

标签 c++ c inner-classes conditional-compilation one-definition-rule

我有一个要在 C 和 C++ 之间共享的类,其中 C 只能将其作为指针获取。但是,因为它是一个内部类,所以不能前向声明。相反,这是我们当前的代码在公共(public)头文件中所做的:

#ifdef __cplusplus
class Container {
public:
    class Object {
        public:
        int x;
    };
};

typedef Container::Object * PObject;
#else

typedef void* PObject;

#endif

这看起来违反了单一定义规则 (ODR),因为 C 和 C++ 使用 #ifdef 看到了不同的定义。但是因为这是一个指针,我不确定这是否会造成真正的问题。 C 仅使用指针将其传递给 C++ 函数,它不会直接对其执行任何操作。例如公共(public)头文件中的这段代码:

#ifdef __cplusplus
extern "C" {
#endif
int object_GetX(PObject pObject);

#ifdef __cplusplus
}
#endif /* __cplusplus */

这是我们在 C++ 文件中实现它的方式:

int object_GetX(PObject pObject) {
    return pObject->x;
}

我的问题是:

  1. 像这样违反 ODR 会导致任何实际问题吗?
  2. 如果是这样,是否有另一种方便的方法将类共享给 C?

最佳答案

首先,类型别名指针通常会带来麻烦。
不要这样做。

其次,“内部”类是一个被过度使用的概念,所以我的第一 react 是考虑它是否真的有必要。

如果有必要,您可以定义一个不透明的空类型并从中派生以确保类型安全:

在共享 header 中:

struct OpaqueObject;

#ifdef __cplusplus
extern "C" {
#endif

int object_GetX(OpaqueObject* pObject);

#ifdef __cplusplus
}
#endif /* __cplusplus */

在 C++ header 中:


struct OpaqueObject {};

class Container {
public:
    class Object : public OpaqueObject {
        public:
        int x;
    };
};


实现:

int object_GetX(OpaqueObject* pObject) {
    return static_cast<Container::Object*>(pObject)->x;
}

关于c++ - 将 C 识别的指针类型定义为内部 C++ 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70246289/

相关文章:

c++ - 如何设计一个始终是另一个类的成员的类

c++ - 将值添加到单独链接的哈希表 C++

C 编程。代码错误不允许我进入下一个函数

char数组和char指针的比较

c - 在第一个错误 C 程序处插入双向链表

c# - 从内部类引发事件以在外部类处理,怎么做?

java - 从其他类访问内部类

c++ - 三元运算符的 decltype 在 MSVC ~C++17 中不同

c++ - QLibrary - 导入一个类

c++ - C++ 中的动态内存分配是什么?