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()if MODIFY_RTP 为 0 的调用。这意味着编译器会检查语句的语法,因此它不会因为它周围的代码发生了变化。如果调试代码没有被编译,它会随着周围代码的变化而衰减,但编译器不会通知您问题,因为预处理器删除了代码,因此编译器本身看不到它。

于 2013-03-21T04:10:35.870 回答
1

如果宏要在除该单个文件之外的其他文件中使用,我建议不要这样做。如果其他人要阅读代码 - 他们必须导航到另一个文件才能找到宏的定义。

#define通常用于替换您将在任何地方使用的文本文字或常量,例如“true”或“false”。在这种情况下,如果有人使用它并且“状态”没有被定义或实例化,它将引发错误。

就个人而言,我只是将它称为一个函数并根据它的作用适当地命名它。只要有一个函数,如果为 false 则返回 0,如果为 true 则返回 1 将使其用法更清晰,并且如果其他人修改代码不太容易被滥用。

如果项目足够大,您可能会在六个月内忘记#define 是什么,所以请提前考虑并避免一些痛苦。

于 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 回答