標準 C++ 無法在運行時根據行號動態跳過代碼並保留上下文變量狀態。這屬於調試器功能,而非語言內置特性。
void complexFunction() {
int state = 0;
// ... 初始化代碼 ...
if (shouldSkipToLabel) goto LABEL_B; // 條件跳轉
// 被跳過的代碼段 A
state = computeA();
LABEL_B:
// 繼續執行的代碼段 B
state = computeB(state);
}
enum class Stage { INIT, PHASE_A, PHASE_B, PHASE_C, DONE };
class Workflow {
Stage currentStage = Stage::INIT;
// 所有階段需要的共享數據
ContextData ctx;
public:
void runFrom(Stage start) {
currentStage = start;
while (currentStage != Stage::DONE) {
switch (currentStage) {
case Stage::INIT: init(ctx); break;
case Stage::PHASE_A: phaseA(ctx); break;
case Stage::PHASE_B: phaseB(ctx); break;
case Stage::PHASE_C: phaseC(ctx); break;
}
}
}
// 獲取完整上下文快照(類似調試器變量檢視)
ContextData getSnapshot() const { return ctx; }
};
// C++20 協程概念示例
generator<int> workflow() {
int a = co_await phaseA(); // 暫停,保存所有局部變量
int b = co_await phaseB(a); // 恢復繼續
co_yield b;
}
co_await 處暫停/恢復。# GDB 腳本示例
define skip_to_line
set $pc = $arg0 # 設置程序計數器(極其危險,需精確地址)
# 無法自動修復棧幀、局部變量、寄存器狀態
end
| 方案 | 跨函數跳轉 | 變量上下文保存 | 複雜度 | 適用場景 |
|---|---|---|---|---|
| goto/標號 | 否 | 手動 | 低 | 簡單函數內部跳過 |
| 狀態機 | 是 | 完整(Context 對象) | 中 | 業務流程控制、可中斷恢復 |
| 協程 | 是 | 自動(編譯器生成幀) | 高(需 C++20) | 異步流程、複雜狀態保持 |
| 調試器操作 | 是 | 完整但極其脆弱 | 極高風險 | 僅調試診斷 |
| 嵌入腳本引擎 | 是 | 腳本層面完整 | 中高 | 高度動態業務邏輯 |
C++ 無原生「按行號跳轉並保存變量」能力。工程上應將流程控制顯式化為狀態機,將上下文數據顯式封裝為對象,實現可控、可維護、可序列化的動態流程調度。