我有一个像
这样的头文件#include <MyUtils.h> // defines namespace MyUtils, and MyUtils::Math
namespace mum=MyUtils::Math;
class LocalClass{
public:
void eat( const mum::array& arr);
};
我的%{ #include %}, %include
文件中有通常的.i
结构。
当我跑步时,我得到:
Error: Unknown namespace 'MyUtils::Math'
SWIG如何/为何不了解命名空间别名?
除了使用#ifndef SWIG
预处理器宏之外还有其他工作吗? (c.f。this discussion(我需要让我的c ++代码独立于swig)
SWIG版本2.0.4
答案 0 :(得分:2)
假设有一个标题
// MyUtils.h
namespace MyUtils {
namespace Math {
typedef int SomeType;
class array {
//
};
}
}
另一个标题
// MyHeader.h
#include <MyUtils.h>
namespace mum=MyUtils::Math;
class LocalClass {
public:
void eat( const mum::array& arr);
};
如果SWIG文件看起来像
// MySwigInterfaceFile.i
%module MySwigModule
#include "MyHeader.h
%include "MyHeader.h"
你遇到麻烦,SWIG会生成无法编译的代码
1)你需要包含所有标题,SWIG不能递归标题,即你必须在MyHeader.h之前的MySwigInterfaceFile.i中包含MyUtils.h,同样适用于使用%include指令的包含
2)你必须使用命名空间MyUtils :: Math;使用#include
跟踪包含3)要使SWIG知道嵌套命名空间内的任何typedef,必须编写
namespace MyUtils {
namespace Math {
%typedef int SomeType;
}
}
使用%include之前的包含
我建议程序员从许多小项目开始,以获得SWIG的实际操作经验。
答案 1 :(得分:0)
SWIG确实支持命名空间别名。我认为这个问题很可能发生在MyUtils.h;也许有预处理器定义,你必须设置它们才能使用名称空间。您可以在SWIG命令行上定义它们。