7

私はCでPythonクラスを書いていますが、デバッグコードにアサーションを入れたいと思っています。assert.h私にぴったりです。これはデバッグコンパイルにのみ入れられるため、Pythonコード*のユーザーに影響を与えるアサートエラーの可能性はありません。

「ライブラリ」コード(Pythonに対してリンクされたコードとは別にする必要があります)を分割して、他のCコードから使用できるようにしようとしています。したがって、私のPythonメソッドは、純粋なCコードの薄いラッパーです。

したがって、「ライブラリ」コードではこれを行うことができません。

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

これは私の純粋なCコードをPythonで汚染するからです。また、単純なものよりもはるかに醜いです

assert(black != white);

Distutilsコンパイラは常にを設定すると思います。つまり、デバッグビルドでもNDEBUG使用できません。assert.h

MacOSとLinux。

ヘルプ!

*Pythonから呼び出されたCコードでのアサートに対して私が聞いた1つの引数。

4

3 に答える 3

8

を使用するだけassert.hです。distutilsが常に定義しているのは神話NDEBUGです。これは、Windows上のMicrosoftのmsvcに対してのみ行われ、Pythonリリースビルドから呼び出された場合にのみ行われます(Pythonデバッグビルドからではありません)。

次に、独自のリリースビルドでNDEBUGを定義するには、-Dコマンドラインオプションをsetup.pybuild_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コードのもう1つのデフォルト。

于 2010-12-27T20:28:18.147 に答える
2

setup.py:のNDEBUGマクロの定義を解除します。

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

これにより、次のようなコマンドラインが作成されます

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

これは(醜いですが)正しいことをします。つまり、アサーションを有効に保ちます。

于 2015-01-15T02:28:34.913 に答える