2017-01-26 10 views
0

Эта полная Swift программа дает код выхода 255:В Swift (Darwin), почему exit() принимает Int32 вместо UInt8?

import Darwin 
exit(-1) 

При запуске из в Xcode я получаю Program ended with exit code: 255; или при компиляции и запуске в командной строке echo $? производит 255; и т. д. В какой-то момент Int32(-1) усекается и интерпретируется как 8-битное целое число без знака.

Я не знаю, где это преобразование происходит (возможно, в Дарвине где-то или когда значение передается в оболочку хоста или ОС?), Но так как 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. Речь идет о том, почему функция 'exit()' в Swift разрабатывается/определяется как есть, а не что-то более разумное для программиста Swift (например, того, кто никогда не делал никаких других языков). Для меня это кажется небезопасным. – jhabbott

+2

'exit()' является библиотечной функцией C, и не имеет значения, вызываете ли вы его из C или из Swift. –

ответ

3

Поскольку это стандарт C exit функция, которая имеет следующий прототип:

void exit(int); 

В вашей системе, int 32 бита, так что почему Свифт использует Int32 для него.

Усечение происходит где-то внутри функции C exit.

+0

Это может быть или не быть причиной - но если это так, то это не имеет смысла с точки зрения дизайна библиотеки - зачем создавать функцию в Свифт, чтобы вести себя непоследовательно с ее собственным определением, только потому, что «это то, что C делает "или" мы реализуем его в C, чтобы мы просто наследовали это поведение "? Если вы принимаете решение о разработке этого поведения для совместимости со сценариями оболочки, которые ожидают 0-255 (потому что это то, что делает C), то, несомненно, вы разработали и задокументировали бы свою функцию, чтобы взять UInt8? – jhabbott

+0

'exit' не является функцией Swift и не предназначен для Swift. Это просто функция C, которую вы можете вызывать из Swift, как и все остальное в «Дарвине». – emlai

+0

hrm .. ok - Думаю, это имеет смысл. Если на самом деле это не предназначено как интерфейс Swift, а отображение на C. Тем не менее, я считаю этот плохой дизайн интерфейса, потому что при создании сопоставления вы должны использовать соглашения/ожидания языка вызова. – jhabbott

 Смежные вопросы

  • Нет связанных вопросов^_^