这个是 C++和 Python 混合编程的问题,所以严格来说似乎标题不准确?
如同前几天发的帖子里所说,我仍在进行 cython 编程测试,为了在 C 的基本语法下在 cython 中复现一些 python 常见操作。
比如以下这个场景:我在命名空间 main 中有一个数组(或者向量) a,我希望将 a 丢入某个函数处理过后,函数没有返回值,但 a 被修改,这种显然是传入一个指针,在 python 中类似于传入 list 或者 dict 的操作。
测试代码如下:
# distutils: language=c++
import cython
from libcpp.vector cimport vector
cdef operation(vector[cython.float] *p):
p.push_back(99)
def main():
# 首先准备一个向量
cdef vector[cython.float] lst
cdef int i
for i in range(5):
lst.push_back(i)
# 丢入函数
operation(&lst)
# 查看结果
print(lst)
以上代码是能够运行的,返回结果[0,1,2,3,4,99],符合预期。
但是仍有一些疑惑,既然输入函数的&lst 是指针的话,那 operation 函数中调用这个指针值的时候,不是应该前面加星号才能取到实际对象么,所以不是应该是\*p.push_back(99)
才能生效才对,为什么不需要加也能运行呢。
其次将上文中 operation 函数内容修改为 p[0] += 1,上次尝试新增项目,这次尝试修改项目,期望返回值为[1,1,2,3,4],然而编译报错
test.cpp(1191): error C2676: 二进制“+=”:“std::vector<float,std::allocator<_Ty>>”不定义该运算符或到
预定义运算符可接收的类型的转换
with
[
_Ty=float
]
为什么会报错,两者有什么区别呢?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.