有没有办法把return 0;“表达式化”?

15 views
Skip to first unread message

not.using pc

unread,
Nov 14, 2013, 9:54:46 AM11/14/13
to learning-l...@googlegroups.com
比如要做三项初始化,失败就退出,可以这么写:(返回0代表成功)
if ( init_x() || init_y || init z  ) return ERROR;

如果这样能够实现的话,代码就可以很简洁,可惜return 0不是表达式。
init_x() || init_y() || init_z() || return 0;

请问有没有办法写成这样:
init_x() || init_y() || init_z() || myreturn() ;

呢?有没有办法利用函数或者别的方式,构造一个表达式,对表达式求值时就结束函数调用并返回值呢?

另外觉得预处理中 do{} while 0   来解决多条展开后的分号问题实在太巧妙了。

Liutos

unread,
Nov 14, 2013, 8:15:40 PM11/14/13
to learning-l...@googlegroups.com
目测是不行的


--
您收到此邮件是因为您订阅了 Google 网上论坛的“Linux C/C++/系统编程 一站式学习”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 learning-linux-c...@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/groups/opt_out。



--
Liutos Love Linux LaTeX Lisp Ling

我的GitHub主页:https://github.com/Liutos

Ivan Zhou

unread,
Nov 14, 2013, 8:52:00 PM11/14/13
to learning-linux-c-cpp

init_x() || init_y() || init_z() ?return 0;

--
发自 Android 网易邮箱


在2013年11月15日 09:15, Liutos写道:

guokr321

unread,
Nov 14, 2013, 9:39:41 PM11/14/13
to learning-linux-c-cpp
没看到这样做会有什么性能上的优势,即使有,如果代码要被别人阅读也会费劲。即使用do while框起来那种宏,还是能不用就不用吧!这不是绝妙,而是知道预处理器怎么干活后的一种诡计吧!不是还有inline吗?当然,inline可能被编译器忽略。
 
2013-11-14

guokr321

发件人:Ivan Zhou <13584...@163.com>
发送时间:2013-11-14 20:52
主题:Re:Re: [learn-linux-c-cpp] 有没有办法把return 0;“表达式化”?
收件人:"learning-linux-c-cpp"<learning-l...@googlegroups.com>
抄送:

Jun Li

unread,
Nov 19, 2013, 9:26:50 AM11/19/13
to learning-l...@googlegroups.com

"请问有没有办法写成这样:
init_x() || init_y() || init_z() || myreturn() ;"

你用setjmp longjmp 倒是可以恢复到之前的call stack, 

void main()
{
    jmp_buf env;
    if (setjmp(env))
    {
         return;
    }
    init_x() || init_y() || my_return(&env);
}

int my_return(jmp_buf* env)
{
     longjmp(*env, 1);
     return 0;      //not executed
}

这个法子其实就是捕获异常了,目测就算嵌入汇编也得是要保存上下文才行吧, 其实还不如 if else



2013/11/14 guokr321 <guok...@163.com>
Reply all
Reply to author
Forward
0 new messages