我的問題是針對setjmp/longjmp關於局部變量的行爲。setjmp/longjmp和局部變量
示例代碼:
jmp_buf env;
void abc()
{
int error;
...
if(error)
longjmp(env);
}
void xyz() {
int v1; // non-volatile; changed between setjmp and longjmp
int v2; // non-volatile; not changed between setjmp and longjmp
volatile int v3; // volatile; changed between setjmp and longjmp
volatile int v4; // volatile; not changed between setjmp and longjmp
...
if(setjmp(env)) {
// error handling
...
return;
}
v1++; // change v1
v3++; // change v3
abc();
}
int main(...) {
xyz();
}
的setjmp的文檔/ longjmp的說:
「所有可訪問的對象具有值作爲時間的longjmp的()被調用, 不同的是對象的值自動存儲持續時間,其中 是包含調用相應 setjmp()的函數的本地,它沒有volatile限定類型,並且在setjmp()調用和longjmp()調用之間發生更改 不確定。
我看到以下兩種可能的解釋:
intepretation1:
局部變量被恢復,除了那些既
- 非易失性和
- 改變
intepretation2:
個局部變量被恢復,除了
- 那些非易失性和
- 那些改變
根據interpretation1後的longjmp只有V1是未定義的。 v2,v3,v4被定義。 根據longjmp之後的解釋2,只定義了v4。 v1,v2,v3未定義。
哪一個是正確的?
順便說一句:我需要一個適用於所有編譯器的通用(「便攜式」)答案,即嘗試使用一個特定的編譯器沒有幫助。
實現注意:變量和非易失性的變量可能與longjmp時相同,或者可能會恢復到setjmp時的值,具體取決於代碼生成。因此'不確定'。所以,如果他們不*改變,這兩個值是相同的,這就是爲什麼不變的變量是安全的。 – greggo 2012-04-13 21:27:11