当使用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

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

引用GPT:
在使用Python/C API为Python添加C++扩展时,本地C++函数通常应该被声明为静态。

声明为静态函数的主要原因是为了限制函数的可见性。在C++中,静态函数只能在当前编译单元(源文件)中访问,无法在其他文件中直接调用。这是为了避免函数在链接时与其他文件中的同名函数冲突。

当我们将C++函数封装为Python可调用函数时,将其声明为静态函数可以确保它只在当前源文件中可见,不会与其他源文件中的同名函数冲突。这对于编写可重用的C++扩展模块非常重要。

在示例代码中,py_addNumbers函数被声明为静态函数,确保它只能在当前源文件中访问。这可以避免命名冲突,并且只有在当前模块中才能使用addNumbers函数名调用该函数。

总结起来,将本地C++函数声明为静态函数是一种良好的实践,可以确保函数的可见性和避免命名冲突。

大体思路,有两种原因:
1、声明为静态可以避免函数重名冲突,因为静态函数只存在于类或文件中,不会与其他函数名称冲突。
2、静态函数可以方便地实现单例模式。它确保一个类只有一个实例,并提供一个全局访问点。