标签: cextension

如何在Ruby中编写C接口比Perl更容易?

根据官方ruby About页面,使用C语言扩展Ruby比使用Perl更容易.我不是一个(perl)XS人,但是我觉得使用Inline :: C快速简单地写一些东西很简单,那么为什么在Ruby中它更容易呢?

在Ruby中编写C扩展比在Perl或Python中更容易,使用非常优雅的API从C调用Ruby.这包括将Ruby嵌入到软件中的调用,用作脚本语言.SWIG接口也可用.

那些做更多C扩展的人的任何进一步解释都是有用的.

ruby perl cextension

8
推荐指数
2
解决办法
1313
查看次数

使用Py_BEGIN_ALLOW_THREADS时如何避免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;
}
Run Code Online (Sandbox Code Playgroud)

这很好用,让我为我的大部分代码发布GIL,但重新抓取它需要它的一小部分代码.

问题是当我用gcc编译它时,我得到:

ext/engine.c:548: warning: '_save' might be used uninitialized in this function
Run Code Online (Sandbox Code Playgroud)

因为Py_BEGIN_ALLOW_THREADS定义如下:

#define Py_BEGIN_ALLOW_THREADS { \
        PyThreadState *_save; \
        _save = PyEval_SaveThread();
Run Code Online (Sandbox Code Playgroud)

那么,三个问题:

  1. 是否有可能压制gcc的警告,
  2. 有没有人知道为什么gcc认为_save可以使用未初始化,因为它在声明后立即分配,并且
  3. 为什么不定义宏来在一个语句中声明和初始化变量以避免问题?

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

我可以通过不使用宏并自己完成所有操作来避免这个问题,但我宁愿不这样做.

python gcc gil cextension

7
推荐指数
1
解决办法
697
查看次数

标签 统计

cextension ×2

gcc ×1

gil ×1

perl ×1

python ×1

ruby ×1