例如...爲什麼超過255的返回碼在C++中返回不同的數字?
#include <iostream>
using namespace std;
int main(){return 300;}
返回:
Process finished with exit code 44
?
例如...爲什麼超過255的返回碼在C++中返回不同的數字?
#include <iostream>
using namespace std;
int main(){return 300;}
返回:
Process finished with exit code 44
?
標準知道只有兩個standaradized返回值:EXIT_SUCCESS
(或零),並EXIT_- FAILURE
:
3.6.1/5在主return語句具有離開主功能的效果(破壞任何具有自動存儲持續時間的對象)和 以返回值作爲參數調用
std::exit
。18.5/8(...)最後,控制返回到主機環境。如果狀態爲零或
EXIT_SUCCESS
,則會返回狀態爲 的實施定義表單。如果狀態爲EXIT_- FAILURE
,則返回的狀態不成功終止的 實現定義形式爲 。 否則返回的狀態是實現定義的。
因此不保證任何其他整數按原樣返回。
在MS Windows例如GetExitCodeProcess()
函數返回整數值,所以你會得到300
在POSIX兼容的系統,如Linux,規則是(「只有8個最低顯著位(即狀態& 0377)應可用於等待的父程序「」。所以對於300,它將是44.
實際上,在unix下,退出代碼在MSB中,所以'(status&0xff00)>> 8'。只有8位的原因是歷史性的:在原來的unix [爲PDP-11開發]下,int是16位,所以'wait'中'status'沒有更大的錯誤代碼。爲了向後兼容,錯誤代碼的大小增加了_not_,儘管大多數曲目現在將'int'定義爲32位實體。如前所述,由於程序返回的代碼是通過操作系統並由系統調用的父級獲得的,因此取決於操作系統類型 –
@CraigEstey有趣的是,謝謝!事實上,我在「* unix操作系統的設計*」中找到了一個說明,說明傳遞給'exit()'的低8位存儲在內部進程返回代碼的第8至15位中。我想這就是爲什麼從['wait()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/wait.html)獲得的返回代碼必須用WIFEXITED( )''''WEXITSTATUS()'等等......並且返回['system()'](http://man7.org/linux/man-pages/man3/system.3.html )。 – Christophe
感謝@HansPassant的更新。實際上,'exit()'的Windows文檔中提到「*主機環境可以使用狀態的低位字節*」,但測試顯示總是返回完整整數,完全如您所述'GetExitCodeProcess()'。即使使用傳統的'execlp()'也會發生這種情況。因此,似乎沒有「唯一」一詞被解釋爲「最低字節或更多」:-) – Christophe
它只需要8位。 '300&0xff == 44'。很確定這主要是Unix的事情。請參閱'waitpid'手冊頁中的'WEXITSTATUS' - 狀態被OR'轉換爲其他值。 – asveikau
你能解釋一下爲什麼嗎?是否有可能返回更高的數字? – leszakk
沒有超過255的返回代碼這樣的事情。操作系統忽略了前八位以外的任何位。 – EJP