使用#define #ifdef作为条件

时间:2013-03-21 03:51:05

标签: c

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 个答案:

答案 0 :(得分: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为0,优化器将消除对modify_rtp_media_stream()的调用。这意味着编译器会检查语句的语法,所以它不会当它周围的代码发生变化时,它会过时。调试代码如果没有编译就会衰减,因为它周围的代码发生了变化,但是编译器没有通知你问题,因为预处理器删除了代码,因此编译器没有看到它。

答案 1 :(得分:1)

如果宏将用于除了那个之外的其他文件中,我建议不要这样做。如果其他人要读取代码 - 他们将不得不导航到另一个文件以找到宏定义的内容。

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

就个人而言,我只是将其称为一个函数,并将其命名为正确的。只要有一个函数,如果为false则返回0,如果为true,则返回1将使其使用更清晰,如果其他人修改了不易使用的代码。

如果项目足够大,你可能会忘记六个月内的#define是什么,所以提前考虑并为自己省去一些痛苦。

答案 2 :(得分: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 

答案 3 :(得分: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