SWIG错误:先声明为'extern'后声明为'static
我正在使用swig来生成一个Python和C++的接口,这样我就可以用Python脚本来调用我的C++函数。目前我已经做到了一些事情:
swig -c++ python filename.i
gcc -c filename.cpp filename_wrap.cxx -shared -Ic:\includepath
这里的包含路径是我的Python 2.7的包含目录。
但是当我尝试用gcc编译时,出现了一堆错误,提示我很多函数被声明为extern(外部)但现在是static(静态)。在原来的cpp文件中,我有一些函数是声明为static的,但我从来没有声明过任何东西为extern。这可能是什么原因呢?
这是我的接口文件
/* Interface */
%module ReadWrite
%{
#include "ReadWrite.h"
%}
%include "ReadWrite.h"
一个头文件的片段(名字已更改)看起来是这样的(没有任何东西被声明为extern):
static bool myfunc1(void);
static bool myfunc2 (type1 *Entry, type2 *Block, type2 *Data);
static bool myfunc3 (type2 *Data, type3 **Records, type2 **Header);
type4 myfunc4 (void) ;
当我执行命令gcc -c ReadWrite.cpp ReadWrite_wrap.cxx -shared -Ic:\includepath时,gcc会给我类似这样的错误:
ReadWrite.cpp:682:79: 错误:'bool myfunc3 (type2 *Data, type3 **Records, type2 **Header)' 被声明为'extern',但后来又被声明为'static'
1 个回答
在头文件中出现的这些函数,默认是外部函数(extern function)。不过,你同时也把它们声明成了静态函数(static)。
因为提到了C++,我这里要做个假设,如果你已经知道这些内容,请见谅,不想让你觉得我在教你。static
在C语言中的含义和在C++中完全不同。在C++中,static
表示某个方法不属于类的实例,任何人都可以随时调用它。而在C语言中,static
这个关键词的意思是“这个函数只能在这个文件内部使用”。所以,当你把某个函数声明为静态时,其实就是在禁止文件外部的人使用它(可以把它理解为C语言中的private
)。
所以,如果你不是这个意思,就不要把它声明为静态。