C++ 为什么python中的函数是静态的?
如果我们想使用内部python API将C/C++集成到python中。然后,函数的签名采用以下形式C++ 为什么python中的函数是静态的?,c++,c,C++,C,如果我们想使用内部python API将C/C++集成到python中。然后,函数的签名采用以下形式 static PyObject *MyFunction( PyObject *self, PyObject *args ); static PyObject *MyFunctionWithKeywords(PyObject *self, PyObject *args, PyObj
static PyObject *MyFunction( PyObject *self, PyObject *args );
static PyObject *MyFunctionWithKeywords(PyObject *self,
PyObject *args,
PyObject *kw);
static PyObject *MyFunctionWithNoArgs( PyObject *self );
为什么这些函数是静态实现的?因此它们仅在定义它们的文件中可用。
不污染全局名称空间。C中函数前面的关键字
static
表示该函数在定义它的翻译单元(大致上是包含头文件之后的源文件)之外不可见。它为函数提供了“内部链接”(用C的说法),因此它对文件是“私有的”。因此您要问的是静态的是什么意思
这意味着这些函数仅在声明它们的文件中可用,以避免与其他定义冲突并污染命名空间
这些文件是静态文件的原因是,所有python函数都将映射到这些文件。请查看它们如何覆盖所有可能函数声明的排列。这些只能在该文件中的此处创建 来自:
因此,可移植性要求不对
符号可见性。这意味着扩展模块中的所有符号
除模块初始化外,应声明为静态
函数,以避免与其他扩展模块的名称冲突
(如第节“模块的方法表和初始化”所述
功能)。这意味着应该可以从
其他扩展模块必须以不同的方式导出
它们确实“污染了全局名称空间”,但它们有内部链接,因此不会导致ODR冲突。它们污染了当前文件中的全局名称空间,但如果我们想这样称呼它,它们不会污染“全局链接器名称空间”。这并没有回答op的问题,而是回答了另一个问题。从op的问题中,他似乎知道什么是static
,只是不知道为什么这些特定函数是静态的。