Różnica między int main () A int main (void)?

Co oznacza:

int main(void) {...} 

VS

int main() {...}

?

Myślę, że int main() {...} oznacza jednak , że main nie odbiera żadnych parametrów (z linii poleceń):

int main(int argc, char *argv[])

Robi.

Ale co oznacza int main(void) {...}? co oznacza void?

Szukałemtutaj ale to jakoś inne pytanie .

 54
Author: Community, 2012-09-01

8 answers

W C++ nie ma różnicy.


W C różnica jest wątpliwa. Niektórzy uwielbiają twierdzić, że ta ostatnia wersja (ta Bez void) jest technicznie tylko powszechnym rozszerzeniem implementacji i nie gwarantuje działania standardu ze względu na sformułowanie w standardzie. Jednak norma jasno stwierdza, że w definicji funkcji pusty zbiór parametrów ma dobrze zdefiniowane zachowanie: że funkcja nie przyjmuje żadnych parametrów. Stąd taka definicja dla główne pasuje do następującego opisu w standardzie:

To [main] definiuje się za pomocą zwracanego typu int i bez parametrów.

Istnieje jednak zauważalna różnica między nimi: mianowicie, WERSJA BEZ void nie dostarcza poprawnego prototypu dla funkcji:

// this is OK.
int main()
{
  if (0) main(42);
}

// this requires a diagnostic to be shown during compiling
int main(void)
{
  if (0) main(42);
}

Oh, I żeby była kompletna: void ma następujące znaczenie we wszystkich deklaratorach funkcji:

(6.7.6. 3p10) szczególny przypadek nienazwanego parametr typu void jako jedyna pozycja na liście określa, że funkcja nie ma parametrów.

 49
Author: eq-,
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-09-01 05:52:44

W C, w prototypie (ale nie w C++) pusta lista argumentów oznacza, że funkcja może przyjmować dowolne argumenty (w definicji funkcji oznacza brak argumentów). W C++ pusta lista parametrów oznacza brak argumentów. W C, aby nie otrzymać argumentów, musisz użyć void. Zobacz to pytanie dla lepszego wyjaśnienia.

 6
Author: Linuxios,
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
2017-05-23 12:34:50

W C++ posiadanie funkcji foo(void) i foo() jest tym samym. Jednak w C jest inaczej: foo(void) Jest funkcją bez argumentów, podczas gdy {[1] } jest funkcją z nieokreślonymi argumentami.

 4
Author: Some programmer dude,
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-09-01 05:38:14

W C++ nie ma różnicy, oba są takie same.

Obie definicje działają również w C, ale druga definicja z void jest uważana za lepszą technicznie, ponieważ jasno określa, że main może być wywołany tylko bez żadnego parametru. W języku C, jeśli sygnatura funkcji nie określa żadnego argumentu, oznacza to, że funkcja może być wywołana z dowolną liczbą parametrów lub bez żadnych parametrów. Na przykład spróbuj skompilować i uruchomić dwa programy w języku C (pamiętaj, aby zapisać pliki jako .c).

 3
Author: Dila Gurung,
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
2015-05-23 03:05:05

Po pierwsze, istnieje różnica co jest dozwolone dla Systemów hostowanych i systemów wolnostojących, jak pokazano tutaj .

Dla Systemów hostowanych, 5.1.2.2.1 uruchomienie programu ma zastosowanie:

Funkcja wywoływana przy starcie programu nosi nazwę main. Realizacja deklaruje nie prototyp dla tej funkcji. Definiuje się go za pomocą typu zwrotnego int i bez parametry:

int main(void)

... (więcej tekstu na temat argv / argc itp style).

Interesująca część to "bez parametrów". int main() i int main (void) są obecnie równoważne, ponieważ oba są deklaratoriami funkcji i nie mają parametrów. Stosuje się następujące przepisy (6.7.6.3):

10 specjalny przypadek nienazwanego parametru typu void jako jedynej pozycji na liście określa, że funkcja nie ma parametrów.

/--/

14 lista identyfikatorów deklaruje tylko identyfikatory parametrów funkcji. An pusty lista w deklaracji funkcji będącej częścią definicji tej funkcji określa, że funkcja nie ma parametrów. pusta lista w deklaracji funkcji, która nie jest częścią definicja tej funkcji określa, że brak informacji o liczbie lub rodzajach parametry są dostarczane.145)

Podkreślenie moje, pogrubiony tekst dotyczy int main(). Na końcu tekstu znajduje się również notatka 145), która mówi "Patrz" przyszłe kierunki językowe" (6.11.6)":

6.11.6 deklaratory funkcji

Używanie deklaratorów funkcji z pustymi nawiasami (nie deklaratorów typu parametru prototype-format) jest funkcją przestarzałą.

I tu jest różnica. Jako deklarator funkcji, int main() jest złym stylem z powodu powyższego, ponieważ nie ma gwarancji, że będzie działać w następnej wersji standardu C. Jest oznaczana jako przestarzała funkcja w C11.

Dlatego zawsze powinieneś używaj int main (void) w systemie hostowanym i nigdy int main(), nawet jeśli te dwie formy są na razie równoważne.


W C++ obie formy są całkowicie równoważne, ale tam int main() jest preferowany styl z subiektywnych, kosmetycznych powodów (Bjarne Stroustrup tak mówi... co jest chyba dość złym uzasadnieniem dla wyjaśnienia, dlaczego robisz coś w określony sposób).

 2
Author: Lundin,
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
2017-05-23 12:02:46

W C++ nie ma różnicy między tymi dwoma, a int main() jest typem podpisu prawnego i zwracanym dla main.

 1
Author: juanchopanza,
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-09-01 05:31:50

Prototyp funkcji mający {[0] } jest absolutnie taki sam jak Type foo(), nie ma różnicy między nimi. Pierwszy może być używany do czytelności.

Podobnie jak w przypadku main - pobierając argumenty lub nie, program nadal może uzyskać dostęp do informacji z linii poleceń za pomocą innych środków, takich jak __argv, __argc, GetCommandLine, lub innych symboli specyficznych dla platformy / kompilatora.

 0
Author: Ajay,
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-09-01 05:33:43

Wiem, że wątek jest stary, ale to pytanie nurtowało mnie jakiś czas temu, więc chciałem dorzucić pół centa(jeśli tak).

Zawsze traktuję funkcje C tak, jakby miały ustaloną ilość argumentów niezależnie od kontekstu, chyba że używają va_args. Oznacza to, że ufam main ' owi, że zawsze będzie miał prototyp:

int main(int argc, char **argv).

Nawet jeśli żadne argumenty nie zostaną przekazane, funkcja ma te argumenty na stosie, ponieważ główna funkcja nie ma funkcji przeciążającej.

C ma zdolność do prymitywnego przeciążania poprzez udawanie, że argumentu nie ma. W takim przypadku argument jest nadal przekazywany i znajduje się na stosie, ale nigdy nie uzyskujesz do niego dostępu, więc ogranicza to jedynie rozmiar kodu źródłowego.

Mówienie int main() oznacza po prostu, że wiem, że funkcja może mieć parametry, ale ich nie używam, więc piszę int main ().

Mówiąc int main (void) mówi, że main z pewnością nie ma argumentów i implikuje, że istnieją dwa różne prototypy funkcji:

int main(void);
int main(int argc, char **argv);

Ponieważ C nie ma przeciążenia funkcji, jest to dla mnie nieco mylące i nie ufam kodowi, który ma w sobie main(void). Nie zrobiłbym tego, gdyby main nigdy nie przyjmował żadnych parametrów, w takim przypadku main (void) byłby całkowicie OK.

Uwaga: w niektórych implementacjach w main jest więcej parametrów niż argc i argv, takich jak env, ale nie przeszkadza mi to, ponieważ Wiem, że nie mówię wprost, że są to jedyne dwa parametry, ale są to minimalne parametry i dobrze jest mieć więcej, ale nie mniej. Jest to w przeciwieństwie do wprost mówiąc int main (void), który krzyczy na mnie, ponieważ ta funkcja nie ma parametrów, co nie jest prawdą, ponieważ tak jest, są one po prostu pominięte.

Oto Mój kod bazowy:

/* sample.c - build into sample. */
#include <stdio.h>

int main(void)
{
    int _argc = *((int *)2686800);
    char ***_pargv = (char ***)2686804;
    int i;

    for (i = 1; i < _argc; ++i) {
        printf("%s ", (*_pargv)[i]);
    }

    return 0;
}

./ sample I clearly have arguments

Funkcja wyraźnie przekazuje jej argumenty, pomimo tego, że wyraźnie mówi, że nie ma, wpisując void do prototypu funkcji.

Jako eq- says above:

(6.7.6. 3p10) szczególny przypadek nienazwanego parametru typu void jako tylko pozycja na liście określa, że funkcja nie ma parametrów.

Twierdzenie, że funkcja ma void jako argument, ale faktycznie posiadanie argumentów na stosie jest sprzecznością.

Chodzi mi o to, że argumenty nadal istnieją, więc jawne twierdzenie, że main jest pozbawiony argumentów, jest nieuczciwe. Uczciwym sposobem byłoby powiedzieć int main (), który twierdzi nic o tym, ile ma parametrów, tylko ile parametrów Ci zależy.

NOTE2: _argc, _pargv są zależne od systemu, aby znaleźć swoje wartości musisz je znaleźć uruchamiając ten program:

/* findargs.c */
#include <stdio.h>

int main(int argc, char **argv)
{
    printf("address of argc is %u.\n", &argc);
    printf("address of argv is %u.\n", &argv);

    return 0;
}

Te wartości powinny pozostać prawidłowe dla konkretnego systemu.

 0
Author: Dmitry,
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
2016-03-24 03:26:11