Cython:啥类似于 C 包含守卫?

Posted

技术标签:

【中文标题】Cython:啥类似于 C 包含守卫?【英文标题】: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 方式解决问题。 【参考方案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

【讨论】:

以上是关于Cython:啥类似于 C 包含守卫?的主要内容,如果未能解决你的问题,请参考以下文章

Cython 一篇通

我应该如何构建包含 Cython 代码的 Python 包

Cython 对进口有啥作用?

使用 Cython 从标头导出常量

如何构建和分发依赖于第三方 libFoo.so 的 Python/Cython 包

Python Cookbook(第3版)中文版:15.10 用Cython包装C代码