7

我正在用 C 编写一个 Python 类,我想在我的调试代码中添加断言。assert.h很适合我。这只会被放入调试编译中,因此断言失败不会影响 Python 代码的用户*。

我正在尝试划分我的“库”代码(它应该与链接到 Python 的代码分开),以便我可以将它与其他 C 代码一起使用。因此,我的 Python 方法是纯 C 代码的精简包装器。

所以我不能在我的“库”代码中这样做:

if (black == white)
{
    PyErr_SetString(PyExc_RuntimeError, "Remap failed");
}

因为这用 Python 污染了我的纯 C 代码。它也比简单的丑得多

assert(black != white);

我相信 Distutils 编译器总是设置,这意味着即使在调试版本中NDEBUG我也无法使用。assert.h

Mac 操作系统和 Linux。

帮助!

*我听说过一个反对在从 Python 调用的 C 代码中断言的论点。

4

3 回答 3

8

只需使用assert.h. 这是 distutils 总是定义的神话NDEBUG;它仅适用于 Windows 上的 Microsoft msvc,并且仅在从 Python 发布版本(而不是从 Python 调试版本)中调用时才这样做。

然后在您自己的发布版本中定义 NDEBUG,将-D命令行选项传递给 setup.py build_ext。

编辑:似乎 NDEBUG 默认是通过 Python 的 Makefile 的 OPT 设置定义的。要重置它,请运行

OPT="-g -O3" python setup.py build
于 2010-12-27T20:51:19.383 回答
2

创建自己的宏,例如myassert()针对不同的情况。或者创建一个宏,它检查全局变量以查看宏是从 Python 代码还是“普通”C 中使用的。Python 模块入口点必须将此变量设置为 true,或者您可以使用函数指针,一个用于 Python代码,C 代码的另一个默认代码。

于 2010-12-27T20:28:18.147 回答
2

取消定义您的 NDEBUG 宏setup.py

ext_modules = [Extension(
    ...
    undef_macros=['NDEBUG'],
)]

这将产生一个命令行,如

gcc ... -DNDEBUG ... -UNDEBUG ...

哪个(虽然丑陋)做了正确的事情,即它保持断言启用。

于 2015-01-15T02:28:34.913 回答