我正在嘗試使用 longjmp 和 setjmp 在 C 中實作例外。我可以讓簡單的案例起作用。但是我希望嵌套例外起作用。作為設計決策,例外不能使用 malloc 而必須使用堆疊。為了實作嵌套例外的鏈表,我似乎使用了全域變數宣告。我想避免這種情況。有沒有辦法在不宣告全域變數的情況下在 C 中獲取全域地址?我想使用串列函式而不使用它們對全域變數進行操作,但我想要一個全域地址,因為如果我使用本地地址,它會在函式退出時消失。變數失去作用域。
我使用這個網站作為靈感和指導。http://www.on-time.com/ddj0011.htm 這是一個簡單的案例:
struct XRecord {
size_t id;
jmp_buf context;
};
struct XRecord __global_exception_record;
float divide(float a, float b) {
if (b == 0.0f) {
//XRAISE(DIVIDE_BY_ZERO)
longjmp(__global_exception_record.context, DIVIDE_BY_ZERO);
}
float c = a / b;
return c;
}
switch (setjmp(__global_exception_record.context)) {
case XCODE:
{
printf("start code block\n");
float c = divide(4.0f, 2.0f);
float d = divide(4.0f, 0.0f);
break;
}
case DIVIDE_BY_ZERO:
printf("error: division by zero\n");
break;
default:
printf("some other error occcured\n");
break;
}
嵌套例外將不起作用,因為它需要一個額外的跳線 buf 來處理兩個例外塊。如果我將跳線 buf 存盤在記錄中并將其放入鏈接串列中,則它必須是全域的,否則變數將失去作用域。我需要一種獲取全域地址的方法。這可以使用匯編來完成嗎?我根本不熟悉匯編。
uj5u.com熱心網友回復:
有沒有辦法在不宣告全域變數的情況下在 C 中獲取全域地址?我想使用串列函式而不使用它們對全域變數進行操作,但我想要一個全域地址,因為如果我使用本地地址,它會在函式退出時消失。變數失去作用域。
讓我們準確:C沒有全域變數本身。人們通常所說的變數是什么意思
- 靜態存盤持續時間和
- 外部聯動。
C 根本沒有說明呼叫堆疊,但在典型的實作中,這就是塊范圍變數的分配方式。這些有
- 自動存盤時間和
- 沒有聯系。
其他可能性包括動態分配的物件,它們具有
- 分配的存盤期限和
- 匿名
您似乎要求結合靜態存盤持續時間和匿名性,但這不可用。C 也沒有抽象地址的概念。在 C 中有物件地址和函式地址。
您可以通過分配的存盤實作匿名目標。然而,盡管這提供了物件本身的匿名性,但在某種程度上,您仍然需要一個命名物件,該物件包含一個指向或至少指向已分配物件的指標。可能你可以安排通過函式引數將它傳遞給你的所有函式,這樣就不會涉及外部名稱,但這會非常具有侵入性。
如果您接受在某處至少需要一個外部名稱,但您想防止直接訪問相關物件,那么您可以使用外部函式的靜態區域變數,或通過一個靜態檔案范圍變數訪問或同一翻譯單元中的更多外部函式。例如,
void *get_storage(void) {
char *the_storage[STORAGE_SIZE]; // static storage duration; no linkage
return the_storage;
}
但是很難看出通過直接訪問the_storage.
一個類似的替代方法是使存盤成為一個靜態的、檔案范圍的物件(靜態存盤持續時間和內部鏈接),并使所有訪問通過執行所需作業的實用程式函式(例如推送嵌套例外/彈出嵌套例外)而無需使存盤本身可直接訪問。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/362401.html
