【发布时间】:2012-03-19 03:40:12
【问题描述】:
我有以下 c++ 函数,它使用字符串设置整数。
#include <sstream>
#include <string>
#include <iostream>
using namespace std;
extern "C" {
int a() {
int number;
string value("100");
std::istringstream strm(value);
strm >> number;
if (strm.fail()) {
cout << "Ouch!" << endl;
}
else {
cout << "Number set to:" << number << endl;
};
return (int)strm.bad();
}
}
int main(int argc, char **argv)
{
a();
}
如果我把它编译成一个程序,它就可以工作。
$ g++ ./streamtest.cc -o streamtest;./streamtest
Number set to:100
但是,如果我从 ctypes 调用相同的函数,它不会设置整数并且“strm”处于“坏”状态。
$ g++ -shared streamtest.cc -o libstreamtest.so
$ python -c "import ctypes;a = ctypes.CDLL('libstreamtest.so').a();print 'Got [%s] from a()' %a"
Ouch!
Got [1] from a()
这让我很困惑。如何让这个函数在 ctypes 下工作?
【问题讨论】:
-
可能是python库加载器没有正确调用标准库流所需的一些全局/静态构造函数?
-
您是否尝试过单步执行并比较它们开始偏离的位置?
-
strm有错误功能吗? (在 strm.fail() 之后打印错误)
-
它适用于 Windows 7 x64。 (x86 构建)
-
我尝试单步执行 python -> c++ 代码,但当我尝试从 python 单步执行 a() 时,gdb (7.3) 会引发核心转储。我还检查了 vallgrind。我找不到 istringstream 类的错误函数。
标签: c++ macos ctypes istringstream