Cóż, może .
Na przykład w dialekcie C używanym w systemie operacyjnym Plan 9main
jest zwykle deklarowany jako void
funkcja, ale status wyjścia jest zwracany do środowiska wywołującego poprzez przekazanie wskaźnika exits()
funkcji do funkcji. Pusty ciąg oznacza sukces, a każdy niepusty ciąg oznacza pewne niepowodzenie. To mógłby być realizowany poprzez main
zwraca char*
wynik.
I z pewnością byłoby możliwe wdrożenie systemu ze statusem float
lub double
zakończeniem.
Więc dlaczego int
? To tylko kwestia konwencji - a ogromną wartość ma to, że działające pod nimi systemy operacyjne i programy podlegają wspólnej konwencji.
Konwencja uniksowa polega na użyciu kodu statusu liczby całkowitej, przy czym zero oznacza sukces i niezerowy błąd oznaczający (ponieważ zazwyczaj jest tylko jeden sposób na sukces, ale wiele sposobów na porażkę). Nie wiem, czy ta konwencja pochodzi od Uniksa; Podejrzewam, że pochodzi z wcześniejszych systemów operacyjnych.
Zmienna zmiennoprzecinkowa byłaby trudniejszą konwencją, ponieważ (a) obsługa zmiennoprzecinkowa nie jest uniwersalna, (b) trudniej jest zdefiniować odwzorowanie między wartościami zmiennoprzecinkowymi a warunkami błędu, (c) różne systemy używają różnych zmiennoprzecinkowych reprezentacje punktów i (d) wyobraź sobie zabawę ze śledzenia błędu zaokrąglania w statusie wyjścia z programu. Z drugiej strony liczby całkowite bardzo dobrze nadają się do wyliczania kodów błędów.
Jak już wspomniałem, Plan 9 używa ciągów, ale narzuca to pewną złożoność zarządzania pamięcią, kodowania znaków itp. O ile wiem, był to nowy pomysł, kiedy Plan 9 go zaimplementował i nie zastąpił istniejącego powszechna konwencja.
(Nawiasem mówiąc, w C ++ main
można tylko powrócić int
, a w C void main
jest dozwolone tylko wtedy, gdy kompilator specjalnie go obsługuje. Wiele kompilatorów nie narzeka zbyt głośno, jeśli piszesz void main
, ale tylko niewielką przesadą jest stwierdzenie, że jest źle .)