Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么python中的函数是静态的?_C++_C - Fatal编程技术网

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

如果我们想使用内部python API将C/C++集成到python中。然后,函数的签名采用以下形式

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
,只是不知道为什么这些特定函数是静态的。