如何避免海湾合作委员会警告在Python C扩展时使用Py_BEGIN_ALLOW_THREADS
-
23-09-2019 - |
题
最简单的方式操纵吉尔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();
因此,三个问题:
- 它可以抑制海湾合作委员会的警告,
- 没有任何人有任何主意,为什么海湾合作委员会认为
_save
可能使用的初始化,因为它是分配到后立即宣言》, - 为什么不宏已经定义的声明和初始化的变量在一个声明,以避免的问题?
(最后两个是真的只是为了我自己的好奇心).
我可以避免的问题通过不使用宏以及这样做所有我自己,但我宁愿没有。
解决方案
- 是的,它可以抑制初始化的警告使用的输出端包含一条的前缀。
-Wall -Wno-uninitialized
如果你想删除这只是警告,你可能只是初始化 _save
一个空的指针,以便它不依赖于功能返回值...这一行代码和评论意义的对我说:
PyThreadState *_save;
_save = 0; /* init as null pointer value */
_save = PyEval_SaveThread();
其他提示
奈德,你可以试试 这些中的一个:
#pragma GCC diagnostic warning "-Wno-unitialized"
#pragma GCC diagnostic error "-Wno-uninitialized"
#pragma GCC diagnostic ignored "-Wno-uninialized"
或忽略 -Wuninitialized
?根据文档,你必须做这个之前的任何数据或功能的定义。也许这会让你禁止的警告,只是对该文件?
不隶属于 StackOverflow