首页 > 其他分享 >c goto动态label跳转

c goto动态label跳转

时间:2024-10-06 20:22:45浏览次数:6  
标签:CASE goto EEOP sum label EEO && 跳转

pg表达式引擎里面各个表达式的串联是使用goto动态label实现的。

// 定义部分
#if defined(EEO_USE_COMPUTED_GOTO)
    static const void *const dispatch_table[] = {
        &&CASE_EEOP_DONE,
        &&CASE_EEOP_INNER_FETCHSOME,
        &&CASE_EEOP_OUTER_FETCHSOME,
        &&CASE_EEOP_SCAN_FETCHSOME,
        &&CASE_EEOP_INNER_VAR,
        &&CASE_EEOP_OUTER_VAR,
        &&CASE_EEOP_SCAN_VAR,
...

// 跳转
        EEO_CASE(EEOP_OUTER_FETCHSOME)
        {
            CheckOpSlotCompatibility(op, outerslot);

            slot_getsomeattrs(outerslot, op->d.fetch.last_var);

            EEO_NEXT();
        }

// 宏定义
#define EEO_SWITCH()        starteval: switch ((ExprEvalOp) op->opcode)
#define EEO_CASE(name)        case name:
#define EEO_DISPATCH()        goto starteval
#define EEO_OPCODE(opcode)    (opcode)

#endif                            /* EEO_USE_COMPUTED_GOTO */

#define EEO_NEXT() \
    do { \
        op++; \
        EEO_DISPATCH(); \
    } while (0)

#define EEO_JUMP(stepno) \
    do { \
        op = &state->steps[stepno]; \
        EEO_DISPATCH(); \
    } while (0)

也就是日常用的比较少的&&操作符。如下:

#include <stdio.h>                                                                                                                                                          
#include <string.h>

enum {
    ADD,
    SUB,
    MUL,
    DIV,
    END 
};

int main(int argc,char *argv[])
{
    static const void *const disptab[] = { 
        &&L_ADD,
        &&L_SUB,
        &&L_MUL,
        &&L_DIV,
        &&L_END
    };  

    int code[] = {ADD,ADD,MUL,MUL,END};
    int i = 0;
    int sum = 0;
    goto *disptab[code[i++]];
L_ADD:
    sum += 2;
    goto *disptab[code[i++]];
L_SUB:
    sum -= 2;
    goto *disptab[code[i++]];
L_MUL:
    sum *= 2;
    goto *disptab[code[i++]];
L_DIV:
    sum /= 2;
    goto *disptab[code[i++]];
L_END:
    printf("sum = %d\n",sum);

    return 0;
}                        

其等价于switch case,如下:

for()
{
    switch()
    {
           case ADD:
               sum += 2;
               break;
        case SUB:
            sum -= 2;
            break;
        case MUL:
            sum *= 2;
            break;
        case DIV:
            sum /= 2;
            break;
        case END:
    }
}

相比来看,速度会更快。

标签:CASE,goto,EEOP,sum,label,EEO,&&,跳转
From: https://www.cnblogs.com/lightdb/p/18439732

相关文章

  • Ubuntu20.04安装LabelImg 以及出现(ModuleNotFoundError: No module named libs.resour
    安装Ubuntu系统安装labelImg:sudoaptinstallpyqt5-dev-tools接下来,通过GitHub下载LabelImg:gitclonehttps://github.com/tzutalin/labelImg.gitcdlabelimg-mastercdrequirements/sudopip3install-rrequirements-linux-python3.txt-ihttps://pypi.tuna.tsing......
  • 手机访问帝国cms PC端网站自动跳转手机端网站的方法
    为了实现帝国CMS手机版和PC版之间的自动跳转,并且不包含具体的域名信息,可以采用相对路径的方式。这样可以确保代码更加通用和灵活。步骤创建JS文件:创建一个JS文件用于检测用户代理并进行跳转。在模板中引用JS文件:在不同的模板页面中引用该JS文件,并设置跳转逻辑。具......
  • 帝国CMS表单提交跳转到指定页面
    以下是如何在表单中添加隐藏字段 ecmsfrom 的示例代码:<formaction="your_action_url.php"method="post"><!--其他表单字段--><!--添加隐藏字段ecmsfrom--><inputtype="hidden"name="ecmsfrom"value="跳转地址"......
  • LabelMe 标注文件格式说明
    LabelMe标注文件格式说明LabelMe简介LabelMe是一款开源的图像标注工具,由麻省理工学院计算机科学与人工智能实验室(CSAIL)开发。它主要用于手动标注图像数据,以便为计算机视觉任务(如目标检测、图像分割和物体识别)生成训练数据。LabelMe提供了一个友好的用户界面,支持多......
  • pbootcms模板提交留言表单后,如何跳转到指定的网址?
    在PbootCMS中,如果你希望在用户提交留言表单后跳转到指定的网址,可以通过修改相关代码来实现这一功能。以下是一个详细的步骤说明和代码示例。步骤1:修改 helper.php 文件打开文件:打开文件 \core\function\helper.php。找到并修改代码:找到第161行左右的代码,通常这部......
  • label-studio的简单使用
    人工标注一、语义角色:Agent:实施动作的主体Action:谓语,动作Patient:承受动作的客体Time:发生动作的时间Location:发生动作的地点二、工具——labelstudio官方网址:OpenSourceDataLabeling|LabelStudio使用工具:labelstudio安装命令:pipinstalllabel-studio启动命令:label-studio访......
  • PBOOTCMS网站访问页面提示:您访问的页面不存在,请核对后重试!如何改成自动404跳转页面
    如果你希望在PbootCMS中将“页面不存在”的错误提示修改为1秒后自动跳转到另一个页面,可以通过修改error.html文件来实现这一功能。以下是详细的步骤和示例代码。步骤1:定位文件打开项目文件夹:打开你的PbootCMS项目文件夹。导航到文件路径:导航至/core/template/error.htm......
  • GaussDB SQL基础语法示例-GOTO语句
    一、前言SQL是用于访问和处理数据库的标准计算机语言。GaussDB支持SQL标准(默认支持SQL2、SQL3和SQL4的主要特性)。本系列将以《云数据库GaussDB—SQL参考》在线文档为主线进行介绍。GOTO语句是直观基本的控制流语句,会导致控制流发生无条件更改。它用于分流至使用SQL过程中定......
  • PBOOTCMS网站访问页面提示:您访问的页面不存在,请核对后重试!如何改成自动404跳转页面
    如果你希望在访问PbootCMS网站时,对于死链提示“您访问的页面不存在”能够自动跳转到另一个页面,可以通过修改error.html文件来实现这一功能。具体步骤打开error.html文件打开根目录下的core/template/error.html文件。修改HTML内容将error.html文件的内容修改为以下内......
  • Android页面跳转与返回机制详解
    在Android开发中,页面跳转是实现应用功能交互的重要手段之一。本文将从Activity之间的跳转、Activity与Fragment之间的跳转、Fragment之间的跳转以及页面返回的问题四个方面进行详细解析。一、Activity之间的跳转Activity是Android应用的基本构建块,代表了一个用户界面的单一屏幕......