"int main (vooid)"? Jak to działa?

Ostatnio musiałem wpisać mały program testowy C i w trakcie tego procesu popełniłem błąd ortograficzny w głównej funkcji, przypadkowo używając vooid zamiast void.

A mimo to działało.

Redukując go do najmniejszej pełnej wersji, skończyło się na:

int main (vooid) {
    return 42;
}

To robi rzeczywiście kompiluje (gcc -Wall -o myprog myprog.c) i po uruchomieniu zwraca 42.

Jak dokładnie jest to poprawny kod?


Oto zapis wycięty i wklejony z mojej bash powłoki do pokaż co robię:

pax$ cat qq.c
int main (vooid) {
    return 42;
}

pax$ rm qq ; gcc -Wall -o qq qq.c ; ./qq

pax$ echo $?
42
 131
Author: paxdiablo, 2011-02-14

4 answers

Po prostu używa składni deklaracji funkcji w starym stylu; domyślnie deklarujesz parametr int o nazwie vooid.

 217
Author: Oliver Charlesworth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-19 18:33:35

To poprawny kod, ponieważ myprog.c zawiera:

int main (vooid) // vooid is of type int, allowed, and an alias for argc
{     
  return 42; // The answer to the Ultimate Question
} 

vooid zawiera jeden plus liczbę przekazywanych argumentów (np. argc). Więc w efekcie wszystko, co zrobiłeś, to zmienić nazwę argc na vooid.

 67
Author: Michael Goldshteyn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-04 13:21:12

W C, domyślnym typem argumentu funkcji jest int. Więc twój program traktuje słowo vooid jako int main(int vooid), które jest doskonale poprawnym kodem.

 23
Author: Chinmay Kanchi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-13 22:49:10

Jest tylko gcc -std=c89 -Wall -o qq qq.c i gcc -std=gnu89 -Wall -o qq qq.c nie emituj Ostrzeżenia. Wszystkie pozostałe standardy emitują ostrzeżenie o typie implicit int dla vooid.

int main(chart) zachowuje się tak samo jak int main (vooid).

return vooid; Zwraca liczbę argumentów wiersza poleceń.

Testowałem z gcc 4.4.5 na Debian testing system.

 19
Author: vpit3833,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-13 22:58:35