【问题标题】:Declaration in C considered definition in C++C 中的声明考虑了 C++ 中的定义
【发布时间】:2020-07-08 18:05:29
【问题描述】:

我正在开发一个包含以下声明的开源 C 文件

static PyTypeObject Bitarraytype;

后面是定义

static PyTypeObject Bitarraytype = {
    /* A bunch of stuff */ 
};

我正在将此代码移植到 C++ (-std=C++2a),但是不再允许上述声明和定义,因为它声称 error: redefinition of 'Bitarraytype'

我不确定是什么原因造成的,因为上面的第一个块只是我理解的声明。为什么这在 C++ 中不起作用,我该如何解决?

【问题讨论】:

  • 对于最后一个问题(绕过它),您是否有理由无法删除“声明”? (在我看来,这就像第一个尝试的解决方法。)
  • 本质上很多中间代码依赖于类型的存在,而类型的定义依赖于中间代码。我不是代码的作者,并且希望尽可能少地更改以使合并请求变得容易。

标签: python c++ c python-c-api


【解决方案1】:

您显示的声明实际上是 C 中的一个暂定定义。C++ 没有该声明,因此您会收到多重定义错误。

声明应标记为extern,以将其标记为声明:

extern PyTypeObject Bitarraytype;

您还需要删除 static 关键字,因为两者不兼容。

【讨论】:

  • 将其标记为 extern 会引发新错误 error: cannot combine with previous 'extern' declaration specifier。不过,删除 static 关键字可以解决该错误。
  • 假设声明是一个文件范围,删除 static 关键字。
  • 好吧,它们是文件范围,但extern 我认为它们是全局范围。我的理解也是,Python 的 C/C++ 扩展中的所有定义都应该是 static
  • @walnut 我认为您可以使用匿名命名空间来完成这项工作:example
  • 不知道我是怎么错过的。已编辑。
猜你喜欢
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
  • 2018-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多