代码#includeiostream#includestring#defineXX_BEGIN(lineNumber)\switch(lineNumber){case0:#defineXX_YIELD(lineNumber)\lineNumber__LINE__;return;case__LINE__:#defineXX_YIELD_F(lineNumber)\lineNumber__LINE__;returnfalse;case__LINE__:#defineXX_YIELD_B(lineNumber)\lineNumber__LINE__;returnfalse;case__LINE__:#defineXX_YIELD_I(lineNumber)\lineNumber__LINE__;return0;case__LINE__:#defineXX_YIELD_Z(lineNumber)\lineNumber__LINE__;return0;case__LINE__:#defineXX_YIELD_TO_BEGIN(lineNumber)\lineNumber0;return;#defineXX_YIELD_F_TO_BEGIN(lineNumber)\lineNumber0;returnfalse;#defineXX_YIELD_B_TO_BEGIN(lineNumber)\lineNumber0;returnfalse;#defineXX_YIELD_I_TO_BEGIN(lineNumber)\lineNumber0;return0;#defineXX_YIELD_Z_TO_BEGIN(lineNumber)\lineNumber0;return0;#defineXX_END(lineNumber)\lineNumber0;}#defineXX_END_F(lineNumber)\lineNumber0;}returntrue;#defineXX_END_I(lineNumber)\lineNumber0;}return1;structTaskVoid{intlineNumber{};voidUpdate(){XX_BEGIN(lineNumber)std::cout[TaskVoid] 步骤1初始化\n;XX_YIELD(lineNumber)std::cout[TaskVoid] 步骤2处理中\n;XX_YIELD(lineNumber)std::cout[TaskVoid] 步骤3完成\n;XX_END(lineNumber)}};structTaskBool{intlineNumber{};boolUpdate(){XX_BEGIN(lineNumber)std::cout[TaskBool] 阶段A\n;XX_YIELD_F(lineNumber)std::cout[TaskBool] 阶段B\n;XX_YIELD_F(lineNumber)std::cout[TaskBool] 阶段C全部完成\n;XX_END_F(lineNumber)}};structTaskInt{intlineNumber{};intUpdate(){XX_BEGIN(lineNumber)std::cout[TaskInt] 第1帧\n;XX_YIELD_I(lineNumber)std::cout[TaskInt] 第2帧\n;XX_YIELD_I(lineNumber)std::cout[TaskInt] 第3帧结束\n;XX_END_I(lineNumber)}};structTaskLoop{intlineNumber{};intcount{};voidUpdate(){XX_BEGIN(lineNumber)std::cout[TaskLoop] 循环第count次步骤A\n;XX_YIELD(lineNumber)std::cout[TaskLoop] 循环第count次步骤B\n;XX_YIELD(lineNumber)std::cout[TaskLoop] 循环第count次步骤C本轮结束回到开头\n;XX_END(lineNumber)}};structTaskBoolLoop{intlineNumber{};intround{};boolUpdate(){XX_BEGIN(lineNumber)std::cout[TaskBoolLoop] 第round轮 步骤1\n;XX_YIELD_F(lineNumber)std::cout[TaskBoolLoop] 第round轮 步骤2\n;XX_END(lineNumber)returnfalse;}};structNPC{intlineNumber{};boolUpdate(){XX_BEGIN(lineNumber)std::cout[NPC] 开始巡逻...\n;XX_YIELD_F(lineNumber)std::cout[NPC] 继续巡逻...\n;XX_YIELD_F(lineNumber)std::cout[NPC] 发现敌人准备攻击\n;XX_YIELD_F(lineNumber)std::cout[NPC] 攻击\n;XX_YIELD_F(lineNumber)std::cout[NPC] 攻击完成返回巡逻\n;XX_END_F(lineNumber)}};staticvoidprintSep(conststd::stringtitle){std::cout\n title \n;}intmain(){printSep(演示1: void 协程 (XX_YIELD));{TaskVoid task;for(intframe1;frame4;frame){std::cout-- 第frame帧 --\n;task.Update();}}printSep(演示2: bool 协程 (XX_YIELD_F / XX_END_F));{TaskBool task;booldonefalse;intframe0;while(!done){frame;std::cout-- 第frame帧 --\n;donetask.Update();std::cout 返回值: (done?true(完成):false(继续))\n;}}printSep(演示3: int 协程 (XX_YIELD_I / XX_END_I));{TaskInt task;intret0;intframe0;while(ret0){frame;std::cout-- 第frame帧 --\n;rettask.Update();std::cout 返回值: ret(ret?(完成):(继续))\n;}}printSep(演示4: 循环协程 (XX_END 重置 循环调用));{TaskLoop task;for(intframe1;frame7;frame){std::cout-- 第frame帧 --\n;task.Update();}}printSep(演示5: bool 循环协程);{TaskBoolLoop task;for(intframe1;frame6;frame){std::cout-- 第frame帧 --\n;booldonetask.Update();std::cout 返回值: (done?true:false)\n;}}printSep(演示6: NPC 状态机协程);{NPC npc;booldonefalse;intframe0;while(!done){frame;std::cout-- 帧frame --\n;donenpc.Update();}std::coutNPC 行为序列结束\n;}return0;}输出演示1: void 协程(XX_YIELD)-- 第1帧 --[TaskVoid]步骤1初始化 -- 第2帧 --[TaskVoid]步骤2处理中 -- 第3帧 --[TaskVoid]步骤3完成 -- 第4帧 --[TaskVoid]步骤1初始化演示2: bool 协程(XX_YIELD_F / XX_END_F)-- 第1帧 --[TaskBool]阶段A 返回值: false(继续)-- 第2帧 --[TaskBool]阶段B 返回值: false(继续)-- 第3帧 --[TaskBool]阶段C全部完成 返回值: true(完成)演示3: int 协程(XX_YIELD_I / XX_END_I)-- 第1帧 --[TaskInt]第1帧 返回值:0(继续)-- 第2帧 --[TaskInt]第2帧 返回值:0(继续)-- 第3帧 --[TaskInt]第3帧结束 返回值:1(完成)演示4: 循环协程(XX_END 重置 循环调用)-- 第1帧 --[TaskLoop]循环第1次步骤A -- 第2帧 --[TaskLoop]循环第1次步骤B -- 第3帧 --[TaskLoop]循环第1次步骤C本轮结束回到开头 -- 第4帧 --[TaskLoop]循环第2次步骤A -- 第5帧 --[TaskLoop]循环第2次步骤B -- 第6帧 --[TaskLoop]循环第2次步骤C本轮结束回到开头 -- 第7帧 --[TaskLoop]循环第3次步骤A演示5: bool 循环协程-- 第1帧 --[TaskBoolLoop]第1轮 步骤1 返回值:false-- 第2帧 --[TaskBoolLoop]第1轮 步骤2 返回值:false-- 第3帧 --[TaskBoolLoop]第2轮 步骤1 返回值:false-- 第4帧 --[TaskBoolLoop]第2轮 步骤2 返回值:false-- 第5帧 --[TaskBoolLoop]第3轮 步骤1 返回值:false-- 第6帧 --[TaskBoolLoop]第3轮 步骤2 返回值:false演示6: NPC 状态机协程-- 帧1 --[NPC]开始巡逻... -- 帧2 --[NPC]继续巡逻... -- 帧3 --[NPC]发现敌人准备攻击 -- 帧4 --[NPC]攻击 -- 帧5 --[NPC]攻击完成返回巡逻 NPC 行为序列结束https://godbolt.org/z/hEb4aM6jW
switch case加宏实现协程类似的操作
发布时间:2026/6/7 5:37:32
代码#includeiostream#includestring#defineXX_BEGIN(lineNumber)\switch(lineNumber){case0:#defineXX_YIELD(lineNumber)\lineNumber__LINE__;return;case__LINE__:#defineXX_YIELD_F(lineNumber)\lineNumber__LINE__;returnfalse;case__LINE__:#defineXX_YIELD_B(lineNumber)\lineNumber__LINE__;returnfalse;case__LINE__:#defineXX_YIELD_I(lineNumber)\lineNumber__LINE__;return0;case__LINE__:#defineXX_YIELD_Z(lineNumber)\lineNumber__LINE__;return0;case__LINE__:#defineXX_YIELD_TO_BEGIN(lineNumber)\lineNumber0;return;#defineXX_YIELD_F_TO_BEGIN(lineNumber)\lineNumber0;returnfalse;#defineXX_YIELD_B_TO_BEGIN(lineNumber)\lineNumber0;returnfalse;#defineXX_YIELD_I_TO_BEGIN(lineNumber)\lineNumber0;return0;#defineXX_YIELD_Z_TO_BEGIN(lineNumber)\lineNumber0;return0;#defineXX_END(lineNumber)\lineNumber0;}#defineXX_END_F(lineNumber)\lineNumber0;}returntrue;#defineXX_END_I(lineNumber)\lineNumber0;}return1;structTaskVoid{intlineNumber{};voidUpdate(){XX_BEGIN(lineNumber)std::cout[TaskVoid] 步骤1初始化\n;XX_YIELD(lineNumber)std::cout[TaskVoid] 步骤2处理中\n;XX_YIELD(lineNumber)std::cout[TaskVoid] 步骤3完成\n;XX_END(lineNumber)}};structTaskBool{intlineNumber{};boolUpdate(){XX_BEGIN(lineNumber)std::cout[TaskBool] 阶段A\n;XX_YIELD_F(lineNumber)std::cout[TaskBool] 阶段B\n;XX_YIELD_F(lineNumber)std::cout[TaskBool] 阶段C全部完成\n;XX_END_F(lineNumber)}};structTaskInt{intlineNumber{};intUpdate(){XX_BEGIN(lineNumber)std::cout[TaskInt] 第1帧\n;XX_YIELD_I(lineNumber)std::cout[TaskInt] 第2帧\n;XX_YIELD_I(lineNumber)std::cout[TaskInt] 第3帧结束\n;XX_END_I(lineNumber)}};structTaskLoop{intlineNumber{};intcount{};voidUpdate(){XX_BEGIN(lineNumber)std::cout[TaskLoop] 循环第count次步骤A\n;XX_YIELD(lineNumber)std::cout[TaskLoop] 循环第count次步骤B\n;XX_YIELD(lineNumber)std::cout[TaskLoop] 循环第count次步骤C本轮结束回到开头\n;XX_END(lineNumber)}};structTaskBoolLoop{intlineNumber{};intround{};boolUpdate(){XX_BEGIN(lineNumber)std::cout[TaskBoolLoop] 第round轮 步骤1\n;XX_YIELD_F(lineNumber)std::cout[TaskBoolLoop] 第round轮 步骤2\n;XX_END(lineNumber)returnfalse;}};structNPC{intlineNumber{};boolUpdate(){XX_BEGIN(lineNumber)std::cout[NPC] 开始巡逻...\n;XX_YIELD_F(lineNumber)std::cout[NPC] 继续巡逻...\n;XX_YIELD_F(lineNumber)std::cout[NPC] 发现敌人准备攻击\n;XX_YIELD_F(lineNumber)std::cout[NPC] 攻击\n;XX_YIELD_F(lineNumber)std::cout[NPC] 攻击完成返回巡逻\n;XX_END_F(lineNumber)}};staticvoidprintSep(conststd::stringtitle){std::cout\n title \n;}intmain(){printSep(演示1: void 协程 (XX_YIELD));{TaskVoid task;for(intframe1;frame4;frame){std::cout-- 第frame帧 --\n;task.Update();}}printSep(演示2: bool 协程 (XX_YIELD_F / XX_END_F));{TaskBool task;booldonefalse;intframe0;while(!done){frame;std::cout-- 第frame帧 --\n;donetask.Update();std::cout 返回值: (done?true(完成):false(继续))\n;}}printSep(演示3: int 协程 (XX_YIELD_I / XX_END_I));{TaskInt task;intret0;intframe0;while(ret0){frame;std::cout-- 第frame帧 --\n;rettask.Update();std::cout 返回值: ret(ret?(完成):(继续))\n;}}printSep(演示4: 循环协程 (XX_END 重置 循环调用));{TaskLoop task;for(intframe1;frame7;frame){std::cout-- 第frame帧 --\n;task.Update();}}printSep(演示5: bool 循环协程);{TaskBoolLoop task;for(intframe1;frame6;frame){std::cout-- 第frame帧 --\n;booldonetask.Update();std::cout 返回值: (done?true:false)\n;}}printSep(演示6: NPC 状态机协程);{NPC npc;booldonefalse;intframe0;while(!done){frame;std::cout-- 帧frame --\n;donenpc.Update();}std::coutNPC 行为序列结束\n;}return0;}输出演示1: void 协程(XX_YIELD)-- 第1帧 --[TaskVoid]步骤1初始化 -- 第2帧 --[TaskVoid]步骤2处理中 -- 第3帧 --[TaskVoid]步骤3完成 -- 第4帧 --[TaskVoid]步骤1初始化演示2: bool 协程(XX_YIELD_F / XX_END_F)-- 第1帧 --[TaskBool]阶段A 返回值: false(继续)-- 第2帧 --[TaskBool]阶段B 返回值: false(继续)-- 第3帧 --[TaskBool]阶段C全部完成 返回值: true(完成)演示3: int 协程(XX_YIELD_I / XX_END_I)-- 第1帧 --[TaskInt]第1帧 返回值:0(继续)-- 第2帧 --[TaskInt]第2帧 返回值:0(继续)-- 第3帧 --[TaskInt]第3帧结束 返回值:1(完成)演示4: 循环协程(XX_END 重置 循环调用)-- 第1帧 --[TaskLoop]循环第1次步骤A -- 第2帧 --[TaskLoop]循环第1次步骤B -- 第3帧 --[TaskLoop]循环第1次步骤C本轮结束回到开头 -- 第4帧 --[TaskLoop]循环第2次步骤A -- 第5帧 --[TaskLoop]循环第2次步骤B -- 第6帧 --[TaskLoop]循环第2次步骤C本轮结束回到开头 -- 第7帧 --[TaskLoop]循环第3次步骤A演示5: bool 循环协程-- 第1帧 --[TaskBoolLoop]第1轮 步骤1 返回值:false-- 第2帧 --[TaskBoolLoop]第1轮 步骤2 返回值:false-- 第3帧 --[TaskBoolLoop]第2轮 步骤1 返回值:false-- 第4帧 --[TaskBoolLoop]第2轮 步骤2 返回值:false-- 第5帧 --[TaskBoolLoop]第3轮 步骤1 返回值:false-- 第6帧 --[TaskBoolLoop]第3轮 步骤2 返回值:false演示6: NPC 状态机协程-- 帧1 --[NPC]开始巡逻... -- 帧2 --[NPC]继续巡逻... -- 帧3 --[NPC]发现敌人准备攻击 -- 帧4 --[NPC]攻击 -- 帧5 --[NPC]攻击完成返回巡逻 NPC 行为序列结束https://godbolt.org/z/hEb4aM6jW