【问题标题】:Cython: What is similar to C include guard?Cython:什么类似于 C 包含守卫?
【发布时间】:2022-01-22 19:18:18
【问题描述】:

我有一堆 Cython 文件,它们以复杂的依赖顺序导入其他文件。问题是,有些 cimport 在编译时会出现这个错误:'Blahblah' redeclarared

这个问题在 C 中用包含保护的非常简单的方法解决了:

#ifndef XXX_HH
#define XXX_HH
...
#endif

我在 Cython 中找不到这样的包含保护类似功能,一般来说有什么解决方法吗? (非临时)

【问题讨论】:

  • 你试过compile-time constants吗?
  • 它说'Cython 中没有直接等效的 C #ifdef/#ifndef'
  • 但是对于第二个 cimport,DEF 还是一样的
  • minimal reproducible example。没有等同于包括警卫。如果您想要一个有用的答案,您可能需要展示一个您实际尝试解决的简单示例
  • 在 C 中,对于他们狡猾的文本包含模型来说,这可以说是一个糟糕的解决方法。所以我不相信 Cython 应该尝试用 1970 年代的 C 方式解决问题。

标签: compilation header include cython


【解决方案1】:

不是真正的#ifndef-similar 答案,只是为了分享这个问题,这很奇怪。问题是由于 cimport-ing 类本身的前向声明。

文件 1 common.pxd

cdef public struct myclass

cdef public cppclass output1:
    myclass* value

cdef public cppclass output2:
    float value

# Many more definitions...

文件 2 myclass.pxd

# Due to common.pxd has so many definitions,
# this asterisk was used to cimport

# ERROR! IT INCLUDES THE FORWARD DECLARATION OF myclass
from common cimport * 

# OK HERE: INCLUDE 1 BY 1
from common cimport output1,output2,...

cdef public cppclass myclass:
    pass

【讨论】:

    猜你喜欢
    • 2012-01-19
    • 2015-03-04
    • 2019-04-25
    • 2011-01-24
    • 2017-07-31
    • 2013-06-22
    • 2011-11-23
    • 1970-01-01
    相关资源
    最近更新 更多