【问题标题】:How do I declare an opaque anonymous structure defined in third-party?如何声明第三方定义的不透明匿名结构?
【发布时间】:2016-03-30 11:32:03
【问题描述】:

我正在开发第三方模块包装器。我希望我的主头文件没有任何第三方相关的头文件。每个参数类型和返回类型都是不透明的,只需声明它。但是有一个匿名结构定义如下:

typedef struct {
    int x;
    int y;
    int width;
    int height;
} IppiPoint;

我无法修改第三方头文件。我不知道要宣布它。这是我尝试过的和收到的错误消息

1.

struct IppiPoint;
error C2371: 'IppiPoint' : redefinition; different basic types

2.

typedef struct IppiPoint;
... warning C4091: 'typedef ' : ignored on left of 'IppiPoint' when no variable is declared
... error C2371: 'IppiPoint' : redefinition; different basic types

如何声明这样的匿名结构?

【问题讨论】:

  • 为什么要声明结构?您显然不应该这样做,只能使用您的第三方头文件已经提供的类型别名。
  • 我想把 type-alias 移到 cpp 文件中,这样我的客户在使用时就看不到任何第三方头了。
  • IppiPoint; 呢?
  • @Fynn 你的意思是在没有结构的情况下声明它吗?它使编译器抱怨缺少类型说明符。
  • 目前你的源“看到”第三方头文件(否则你不会得到“重新定义”错误)。如果您声明这种类型的非指针变量,或者尝试使用malloc 进行分配,那么您无论如何需要完整的结构。

标签: c++ opaque-pointers


【解决方案1】:

创建您自己的类型struct Bob;。改用它。

在cpp中,定义struct Bob如下:

struct Bob {
  IppiPoint contents;
};

只要IppiPoint是标准布局,你就可以合法地reinterpret_cast<IppiPoint*>(pointer_to_bob)

一个指向标准布局结构类型对象的指针可以被 reinterpret_cast 指向它的第一个非静态数据成员(如果它有非静态数据成员)或它的第一个基类子对象(如果有的话) ,反之亦然。 (在第一个数据成员之前不允许填充)。请注意,严格的别名规则仍然适用于此类转换的结果。

也许选择一个比 Bob 更好的名字。

【讨论】:

  • reinterpret_cast 不会破坏严格的别名规则吗?
  • @TartanLlama Make struct Bob { IppiPoint contents; },然后重新解释演员表保证工作。
猜你喜欢
  • 1970-01-01
  • 2013-05-19
  • 1970-01-01
  • 2011-04-27
  • 2015-04-06
  • 2016-01-13
  • 1970-01-01
  • 1970-01-01
  • 2016-12-26
相关资源
最近更新 更多