最简单的方式操纵吉尔Python C扩展是使用宏提供:

my_awesome_C_function() 
{
    blah;

    Py_BEGIN_ALLOW_THREADS

    // do stuff that doesn't need the GIL

    if (should_i_call_back) {
        Py_BLOCK_THREADS
        // do stuff that needs the GIL
        Py_UNBLOCK_THREADS
    }

    Py_END_ALLOW_THREADS

    return blah blah;
}

这个伟大的工程,让我释放吉尔的大部分,我的代码,但是,重新抓住这对于小型代码位需要它。

问题是,当我汇编这与海湾合作委员会,我得到:

ext/engine.c:548: warning: '_save' might be used uninitialized in this function

因为Py_BEGIN_ALLOW_THREADS定义是这样的:

#define Py_BEGIN_ALLOW_THREADS { \
        PyThreadState *_save; \
        _save = PyEval_SaveThread();

因此,三个问题:

  1. 它可以抑制海湾合作委员会的警告,
  2. 没有任何人有任何主意,为什么海湾合作委员会认为 _save 可能使用的初始化,因为它是分配到后立即宣言》,
  3. 为什么不宏已经定义的声明和初始化的变量在一个声明,以避免的问题?

(最后两个是真的只是为了我自己的好奇心).

我可以避免的问题通过不使用宏以及这样做所有我自己,但我宁愿没有。

有帮助吗?

解决方案

  1. 是的,它可以抑制初始化的警告使用的输出端包含一条的前缀。

-Wall -Wno-uninitialized

如果你想删除这只是警告,你可能只是初始化 _save 一个空的指针,以便它不依赖于功能返回值...这一行代码和评论意义的对我说:

PyThreadState *_save; 
_save = 0; /* init as null pointer value */
_save = PyEval_SaveThread();

其他提示

我的两个分:

  1. 你可以抑制的具体警告,但是我猜你已经知道了。
  2. 它说的 可能会 被初始化:-)
  3. 唯一的理由我可以想象的是兼容性与老年C编译器。

我试图挖到 , 但找不到任何好的线索。

奈德,你可以试试 这些中的一个:

#pragma GCC diagnostic warning "-Wno-unitialized"
#pragma GCC diagnostic error "-Wno-uninitialized"
#pragma GCC diagnostic ignored "-Wno-uninialized"

或忽略 -Wuninitialized?根据文档,你必须做这个之前的任何数据或功能的定义。也许这会让你禁止的警告,只是对该文件?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top