我有一个要在 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;
}
我的问题是:
- 像这样违反 ODR 会导致任何实际问题吗?
- 如果是这样,是否有另一种方便的方法将类共享给 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/