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
似乎很奇怪吗?
非常感谢任何建议,
答案 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