免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2567 | 回复: 6
打印 上一主题 下一主题

if (0)中的语句也能执行? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-10-12 14:19 |只看该作者 |倒序浏览
最近在看libass相关字幕,发现if (0) 中的语句也被执行,不知为什么?(在ass.c中), 我在vs2008下测试是不可以的。 谁能给解释一下
if (0) { // cool

#define NEXT(str,token) \
        token = next_token(&str); \
        if (!token) break;

#define ANYVAL(name,func) \
        } else if (strcasecmp(tname, #name) == 0) { \
                target->name = func(token); \
                mp_msg(MSGT_ASS, MSGL_DBG2, "%s = %s\n", #name, token);

#define STRVAL(name) \
        } else if (strcasecmp(tname, #name) == 0) { \
                if (target->name != NULL) free(target->name); \
                target->name = strdup(token); \
                mp_msg(MSGT_ASS, MSGL_DBG2, "%s = %s\n", #name, token);
               
#define COLORVAL(name) ANYVAL(name,string2color)
#define INTVAL(name) ANYVAL(name,atoi)
#define FPVAL(name) ANYVAL(name,atof)
#define TIMEVAL(name) ANYVAL(name,string2timecode)
#define STYLEVAL(name) \
        } else if (strcasecmp(tname, #name) == 0) { \
                target->name = lookup_style(track, token); \
                mp_msg(MSGT_ASS, MSGL_DBG2, "%s = %s\n", #name, token);

#define ALIAS(alias,name) \
        if (strcasecmp(tname, #alias) == 0) {tname = #name;}

/**
* \brief Parse the tail of Dialogue line
* \param track track
* \param event parsed data goes here
* \param str string to parse, zero-terminated
* \param n_ignored number of format options to skip at the beginning
*/
static int process_event_tail(ass_track_t* track, ass_event_t* event, char* str, int n_ignored)
{
        char* token;
        char* tname;
        char* p = str;
        int i;
        ass_event_t* target = event;

        char* format = strdup(track->event_format);
        char* q = format; // format scanning pointer

        if (track->n_styles == 0) {
                // add "Default" style to the end
                // will be used if track does not contain a default style (or even does not contain styles at all)
                int sid = ass_alloc_style(track);
                track->styles[sid].Name = strdup("Default";
                track->styles[sid].FontName = strdup("Arial";
        }

        for (i = 0; i < n_ignored; ++i) {
                NEXT(q, tname);
        }

        while (1) {
                NEXT(q, tname);
                if (strcasecmp(tname, "Text" == 0) {
                        char* last;
                        event->Text = strdup(p);
                        if (*event->Text != 0) {
                                last = event->Text + strlen(event->Text) - 1;
                                if (last >= event->Text && *last == '\r')
                                        *last = 0;
                        }
                        mp_msg(MSGT_ASS, MSGL_DBG2, "Text = %s\n", event->Text);
                        event->Duration -= event->Start;
                        free(format);
                        return 0; // "Text" is always the last
                }
                NEXT(p, token);

                ALIAS(End,Duration) // temporarily store end timecode in event->Duration
                if (0) { // cool
                        INTVAL(Layer)
                        STYLEVAL(Style)
                        STRVAL(Name)
                        STRVAL(Effect)
                        INTVAL(MarginL)
                        INTVAL(MarginR)
                        INTVAL(MarginV)
                        TIMEVAL(Start)
                        TIMEVAL(Duration)
                }
        }
        free(format);
        return 1;
}

论坛徽章:
0
2 [报告]
发表于 2010-10-12 14:39 |只看该作者
没仔细看你的程序,但我认识这是绝对不可能的.

论坛徽章:
0
3 [报告]
发表于 2010-10-12 14:56 |只看该作者
调试用的占位符吧?

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
4 [报告]
发表于 2010-10-12 15:00 |只看该作者
宏扩展了之后类似
if (0)
{} else if (...){ ...

当然会被执行了

论坛徽章:
0
5 [报告]
发表于 2010-10-13 07:42 |只看该作者
昨晚睡觉前也想明白了,即hellioncu所言,多谢!

论坛徽章:
0
6 [报告]
发表于 2010-10-13 09:07 |只看该作者
4楼真牛  这都想到了

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
7 [报告]
发表于 2010-10-13 09:17 |只看该作者
虽然COOL,但是不利于日后维护。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP