如何在使用Py时避免Python C扩展中的gcc警告
在Python C扩展中操纵GIL的最简单方法是使用提供的宏:
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;
}
这很好,让我释放大部分代码中的GIL,但重新获取需要它的小部分代码。
问题是当我用gcc编译这个时,我得到:
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
? 根据文档,您必须在定义任何数据或函数之前执行此操作。 也许它会让你禁用该文件的警告?
上一篇: How to avoid gcc warning in Python C extension when using Py