加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 为什么要使用预处理器指令进行“案例”声明?

发布时间:2020-12-16 03:19:33 所属栏目:百科 来源:网络整理
导读:我正在浏览SpiderMonkey引擎源,并在解释器中看到一些令我感兴趣的代码. // Portable switch-based dispatch.# define INTERPRETER_LOOP() the_switch: switch (switchOp)# define CASE(OP) case OP:# define DEFAULT() default: (来源:https://dxr.mozilla.
我正在浏览SpiderMonkey引擎源,并在解释器中看到一些令我感兴趣的代码.
// Portable switch-based dispatch.
# define INTERPRETER_LOOP()       the_switch: switch (switchOp)
# define CASE(OP)                 case OP:
# define DEFAULT()                default:

(来源:https://dxr.mozilla.org/mozilla-b2g44_v2_5/source/js/src/vm/Interpreter.cpp#1579)

定义类似案例OP的任何非风格的好处:作为CASE(OP)?

解决方法

Look up半屏:
#if (defined(__GNUC__) ||                                                         
     (__IBMC__ >= 700 && defined __IBM_COMPUTED_GOTO) ||                      
     __SUNPRO_C >= 0x570)
// Non-standard but faster indirect-goto-based dispatch.
# define INTERPRETER_LOOP()
# define CASE(OP)                 label_##OP:
// ... <snip>
#else
// Portable switch-based dispatch.
# define INTERPRETER_LOOP()       the_switch: switch (switchOp)
# define CASE(OP)                 case OP:
// ... <snip>
#endif

GCC和其他一些编译器支持“computed goto”,即faster than a loop-switch for an interpreter loop,但是是非标准的,因此不可移植.

如果编译器支持计算的goto,则#if的第一个分支定义了INTERPRETER_LOOP,CASE(OP)等,以使用计算的goto;否则,#else分支根据标准设施来定义它们.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读