「已注销」 2023-06-18 17:04 采纳率: 100%
浏览 41
已结题

当使用Python/C API为Python添加C++扩展时,本地C++函数为什么或者应该被声明为静态吗?

当使用Python/C API为Python添加C++扩展时,本地C++函数为什么或者应该被声明为静态吗?

#include <Python.h>

// 将C++函数封装为Python可调用函数
static PyObject* py_addNumbers(PyObject* self, PyObject* args) {
    int a, b;
    if (!PyArg_ParseTuple(args, "ii", &a, &b)) {
        return nullptr;
    }

    int result = a + b;
    return PyLong_FromLong(result);
}

// 扩展模块初始化函数
PyMODINIT_FUNC PyInit_example(void) {
    static PyMethodDef ModuleMethods[] = {
        { "addNumbers", py_addNumbers, METH_VARARGS, "Add two numbers" },
        { nullptr, nullptr, 0, nullptr }
    };

    static PyModuleDef ModuleDef = {
        PyModuleDef_HEAD_INIT,
        "example",
        "Example module",
        -1,
        ModuleMethods
    };

    PyObject* module = PyModule_Create(&ModuleDef);
    return module;
}

例如,在上面的例子中,py_addNumbers 函数被声明为静态。我在官方文档https://docs.python.org/zh-cn/3/extending/extending.html中看到,使用Python/C++ API时,本地C++函数也被声明为静态。
为什么要这样做,或者可以不这样做吗?原因是什么?
这个问题困扰我好久了,需要一位有相关编程经验的专业人士帮忙解答,谢谢。
下面是官方文档里的一段解释,看了也还是不太明白

img

  • 写回答

3条回答 默认 最新

  • Minuw 2023-06-18 18:06
    关注

    本地C++函数声明为静态函数可以避免符号冲突,避免与其他模块中的同名函数发生符号冲突(静态函数的作用域限制在当前编译单元),不会被其他编译单元访问。
    也可以减少命名空间污染。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月20日
  • 已采纳回答 6月20日
  • 创建了问题 6月18日

悬赏问题

  • ¥15 Android Navigation: 某XDirections类不能自动生成
  • ¥20 C#上传XML格式数据
  • ¥15 elementui上传结合oss接口断点续传,现在只差停止上传和继续上传,各大精英看下
  • ¥100 单片机hardfaulr
  • ¥20 手机截图相片分辨率降低一半
  • ¥50 求一段sql语句,遇到小难题了,可以50米解决
  • ¥15 速求,对多种商品的购买力优化问题(用遗传算法、枚举法、粒子群算法、模拟退火算法等方法求解)
  • ¥100 速求!商品购买力最优化问题(用遗传算法求解,给出python代码)
  • ¥15 虚拟机检测,可以是封装好的DLL,可付费
  • ¥15 kafka无法正常启动(只启动了一瞬间会然后挂了)