0
gcc 4.7.2
c89

こんにちは、

テストしている次のコードがありますが、rtpストリームは変更されません。

#define DO_MODIFY_RTP
#ifdef DO_NOT_MODIFY_RTP
    if(modify_rtp_media_stream(channel->ipm) == FALSE) {
        status = FALSE;
    }
#endif

rtpストリームの変更をテストする場合は、次のように設定#defineします。

#define DO_MODIFY_RTP
#ifdef DO_MODIFY_RTP
    if(modify_rtp_media_stream(channel->ipm) == FALSE) {
        status = FALSE;
    }
#endif

最終的に、これは構成ファイルのプロパティによって制御されます。しかし、私はそれを行う前に両方のケースをテストしているだけです。

このように使うのはおかしいと#define思いませんか?

提案をありがとう、

4

4 に答える 4

3

通常、ソース コードを変更する必要はないので、おそらく次のようにします。

#undef MODIFY_RTP
#if defined(DO_NOT_MODIFY_RTP)
#define MODIFY_RTP 0
#else
#define MODIFY_RTP 1
#endif

if (MODIFY_RTP)
{
    if (modify_rtp_media_stream(channel->ipm) == FALSE)
        status = FALSE;
}

コンパイラ コマンド ラインで を-DDO_NOT_MODIFY_RTP使用するか、構成ヘッダーで を記述できます#define DO_NOT_MODIFY_RTP。RTP ストリームは変更されません。マクロの定義を省略するDO_NOT_MODIFY_RTPと、関数が呼び出され、RTP ストリームが変更される可能性があります。

または、条件を逆にして、デフォルトでストリームを変更しないようにすることもできます。

#if defined(DO_MODIFY_RTP)
#define MODIFY_RTP 1
#else
#define MODIFY_RTP 0
#endif

示されているコードの大きな利点は、常にコンパイルされることですが、modify_rtp_media_stream()MODIFY_RTP が 0 の場合、オプティマイザーは への呼び出しを排除します。これは、コンパイラーがステートメントの構文をチェックすることを意味します。その周りのコードが変わります。デバッグ コードは、その周りのコードが変更されたときにコンパイルされないと劣化する傾向がありますが、コンパイラ自体が認識しないようにプリプロセッサがコードを削除したため、コンパイラは問題を通知しません。

于 2013-03-21T04:10:35.870 に答える
1

マクロがその単一のファイル以外の他のファイルで使用される場合は、これを実行しないことをお勧めします。他の誰かがコードを読む場合、マクロが定義されているものを見つけるために、別のファイルに移動する必要があります。

#define通常、「true」や「false」など、どこでも使用するテキスト リテラルまたは定数を置き換えることを意図しています。この場合、誰かがこれを使用し、「ステータス」が定義またはインスタンス化されていないと、エラーがスローされます。

個人的には、それを関数と呼び、それが何をしているかに応じて適切な名前を付けます。false の場合は 0 を返し、true の場合は 1 を返す関数を用意するだけで、その使用法が明確になり、他の誰かがコードを変更して悪用される可能性が低くなります。

プロジェクトが十分に大きい場合、#define が何であるかを 6 か月で忘れてしまう可能性があるため、事前に考えて、多少の手間を省いてください。

于 2013-03-21T03:58:01.127 に答える
1

テスト陽性

#define DO_MODIFY_RTP
#ifdef DO_MODIFY_RTP // 
if(modify_rtp_media_stream(channel->ipm) == FALSE) {
        status = FALSE;
    }
#endif 

テスト陰性

#define DO_MODIFY_RTP
#ifndef DO_MODIFY_RTP // 
if(modify_rtp_media_stream(channel->ipm) == FALSE) {
        status = FALSE;
    }
#endif 
于 2013-03-21T04:03:18.240 に答える
1

あなたが提案する方法は、まったく標準的ではありません。その構成では通常同じであるため、マクロが異なることに気付くためによく見る必要がありました。

これはより一般的です:

#define DO_MODIFY_RTP
#ifdef DO_MODIFY_RTP
    if(modify_rtp_media_stream(channel->ipm) == FALSE) {
        status = FALSE;
    }
#endif

また

#undef DO_MODIFY_RTP
#ifdef DO_MODIFY_RTP
    if(modify_rtp_media_stream(channel->ipm) == FALSE) {
        status = FALSE;
    }
#endif
于 2013-03-21T04:10:24.593 に答える