gpt4 book ai didi

c# - SWIG 中的命名空间常量

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:52:45 26 4
gpt4 key购买 nike

问题相当简单,我在 C++ 命名空间中有一些常量,我想使用 SWIG 2.0.8 对其进行包装。它看起来像这样:

namespace Example {
static const float PI = 3.14159f
...
/* Lots of classes are here */
}

不幸的是,SWIG 处理这个问题相当笨拙。在 C# 的情况下,它将常量添加到一个与命名空间同名的类中,因此必须使用 Example.Example.PI 访问它,即使我明确地 using Example(由于被模块名称屏蔽)。

在 Java 中,情况更糟,因为它根本不将其视为常量,我被迫使用 Example.getPI() 作为方法调用而不是常量类变量来调用它.

如果我将常量移动到全局命名空间,这似乎可行,但必须使用 ExampleConstants.PI 访问变量。

理想情况下,我希望两种语言都能够通过 Example.PI 访问常量,以与 C++ 保持一致。但是,如果我可以在我的命名空间中有一个 Constants 类,这样我就可以在任何一种语言中使用 Constants.PI,我会很高兴地做出妥协。但是当然,C++ 不允许在类中定义非整数类型,这仍然不能解决 Java 中的问题。

是否有任何优雅的方式来使用 SWIG 处理这些命名空间常量?如果没有,我是否可以手动添加 Java 或 C# 类来定义它们?

最佳答案

我为 C++ - C# 解决了类似的问题。我不确定这是否正是您要查找的内容,但我希望您能找到一些对您有用的信息。

我没有在我的项目中接触过 Java 代码。

Swig 解决方案。

我用 C++ 中的公共(public)静态无参数函数创建了类。

然后我使用 SWIG 将它们导出到 C#。
我在命令行中使用 -namespace <name> 为 C# 指定了命名空间 key 。更多详细信息,请访问页面 SWIG and C#

因此,您可以实现解决方案以使用 Constants::PI() 访问您的常量和 Constants.PI()

直接解决方案

如果您不想使用 SWIG 或其他库,您应该使用 PInvoke .使用它时有很多细节和特殊情况。我找到的关于该主题的最全面的文章是 Mono Interop with Native Libraries

你应该考虑JNI用于 Java。

请注意,C++ 函数作为纯 C 函数在没有 namespace 的情况下导出,您应该创建 C# 类并使用 DllImport attribute 创建函数将函数包装回命名空间。

一般来说,如果您的 C++ 接口(interface)或多或少是固定的和/或很小,我会坚持直接解决方案,因为 SWIG 层有许多特定情况,应该与 PInvoke/JNI 一起学习。但是,如果您的 C++ 接口(interface)经常更改并且需要付出大量努力来保持 C++、C# 和 Java 的一致性,那么您肯定需要考虑 SWIG。

您可以在 https://stackoverflow.com/a/11909571/13441 找到使用 PInvoke 的重要示例

关于 C++ 常量。您可以在类中指定 C++ 常量,引用 C++ static constant string (class member)了解详情。

我使用 SWIG 1.3.40。

希望对您有所帮助。

关于c# - SWIG 中的命名空间常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13909406/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com