2017-01-26 13 views
0

這個完整的斯威夫特程序給出了255的退出代碼:在Swift(達爾文)中,爲什麼exit()採用Int32而不是UInt8?

import Darwin 
exit(-1) 

當從在Xcode中,我得到Program ended with exit code: 255運行;或者編譯並在命令行echo $?上運行時產生255;等等。在某點Int32(-1)被截斷並被解釋爲無符號的8位整數。

我不知道這個轉換髮生在什麼地方(可能在達爾文某處或者當這個值被傳遞到主機shell或者操作系統?),但是因爲exit()是一個達爾文庫函數(不是Swift語言特性),已經專用於該平臺,爲什麼它定義爲採取Int32而不是UInt8

+1

參見例如http://stackoverflow.com/questions/1703741/basic-c-question-about-return-values或http://stackoverflow.com/questions/26435730/forked-child-exits-with-1-but-wexitstatus-得到-255。 –

+0

@MartinR這兩個問題都是關於C的,這個問題不是關於爲什麼255彈出。這是關於爲什麼Swift中的exit()函數是按原樣設計/定義的,而不是Swift程序員(例如從未使用任何其他語言的人)更明智。這對我來說似乎是非常不靈活的。 – jhabbott

+2

'exit()'是一個C庫函數,如果你從C或Swift調用它,沒關係。 –

回答

3

,因爲它是標準的C exit功能,它的原型如下:

void exit(int); 

在您的系統int是32位的,所以就是爲什麼雨燕採用Int32它。

截斷某處發生的C exit函數內。

+0

這可能是也可能不是這個原因 - 但如果它從圖書館設計的角度來看沒什麼意義 - 爲什麼在Swift中設計一個函數的行爲與它自己的定義不一致,僅僅是因爲「這就是C做的「或」我們正在C中實現它,所以我們只會繼承這種行爲「?如果你做出設計決定採用該行爲來與期望0-255的shell腳本兼容(因爲這就是C所做的),那麼你肯定會設計並記錄你的函數來使用UInt8? – jhabbott

+0

'exit'不是Swift函數,並不適用於Swift。這只是一個可以從Swift調用的C函數,就像'Darwin'中的其他所有函數一樣。 – emlai

+0

hrm ..好吧 - 我想這是有道理的。如果它實際上不是作爲一個Swift接口,而是一個映射到C的接口。儘管如此 - 我認爲這是糟糕的界面設計,因爲在創建映射時,應該使用調用語言的約定/期望。 – jhabbott

相關問題