Pytanie Definicja main () w C [duplikacie]


Możliwe duplikaty:
Standardowy sposób definiowania funkcji bez parametrów main () w C 

Czy mogę użyć a.? deklaracja definicja funkcji main() w C, który wygląda jak:

int main() {}

Tak, widziałem, że ten standard mówi, że istnieją tylko dwie gwarantowane wersje:

int main(void) {}

i

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

Ale co z pustymi paratezami? Wiem, że ma on inne znaczenie niż w C ++ (w C oznacza to, że liczba i typy parametrów tej funkcji nie są znane), ale widziałem naprawdę dużo kodu w C z tym deklaracja definicja głównej.

Więc kto się myli?


10
2017-08-27 17:26


pochodzenie


Krótka odpowiedź brzmi: "prawdopodobnie możesz uciec, ponieważ twój kompilator jest prawdopodobnie w dość łagodnym otoczeniu, ale w tym samym czasie prawdopodobnie nie powinieneś próbować, ponieważ jest lekko błędny, nieznacznie uszkadza przenośność, może wywoływać ostrzeżenia kompilatora, i nie przynosi ci żadnych korzyści. " - fennec


Odpowiedzi:


W C występuje różnica między deklaracje  int main(); i int main(void); (pierwsza deklaruje funkcję z nieokreślony liczba argumentów, a ta druga jest faktycznie nazywana a prototyp). Jednak w funkcji definicja, obie main() i main(void) zdefiniuj funkcję, która bierze Nie argumenty.

Drugi podpis, main(int, char**), jest alternatywny Formularz. Zgodne implementacje muszą akceptować obie formy, ale mogą również akceptować inne podpisy zdefiniowane w ramach implementacji main(). Dany program może oczywiście zawierać tylko jeden wywoływana jest jedna funkcja main.


9
2017-08-27 17:31



Chcesz wspomnieć o Sekcji J.5 Common Extensions w standardzie C99? §J.5.1 Argumenty środowiskowe / ¶1 W środowisku hostowanym główna funkcja otrzymuje trzeci argument, char *envp[], który wskazuje na zakończoną znakiem Null tablicę wskaźników, z których każda wskazuje na ciąg, który dostarcza informacji o środowisku dla tego wykonania programu (5.1.2.2.1). - Jonathan Leffler
nie jest prawdą twoje pierwsze zdanie: main() przyjmuje nieznaną liczbę argumentów; tylko main(void) nie przyjmuje żadnych argumentów - Federico
Warto zauważyć, że chociaż int main() {...} ponieważ definicja rzeczywiście definiuje funkcję bez argumentów, to jednak samo w sobie nie wprowadza prototypu main. To znaczy. po takiej definicji main jest wciąż zdeklarowany jako funkcja o nieokreślonych parametrach. "Brak argumentów" nieco wpływa na ciało main tylko. - AnT
Masz na myśli to, że w C istnieją różnice dotyczące miejsca umieszczenia pustych paranthesów - w deklaracji funkcji lub definicji funkcji? deklaracja funkcji z pustą () - funkcja o nieokreślonej liczbie i typach argumentów, definicja funkcji z pustą () - funkcja nie przyjmuje argumentów. Dobrze? Czy możesz napisać cytat ze Standardu, jeśli możesz? - FrozenHeart
@NikitaTrophimov: Połączony temat "możliwy duplikat" zawiera standardowe referencje. - Kerrek SB


int main() i każdej innej deklaracji funkcji takiej jak ta, przyjmuje ona nieznaną liczbę argumentów, więc jest to absolutnie błędne dla głównej funkcji. int main(void) nie wymaga żadnych argumentów.

char* argv[] jest argnie vector. Kiedy piszesz argument w wierszu poleceń, znajdziesz argumenty w tym wektorze ciągów. Czasami możesz także znaleźć char **argv ale to jest to samo. Nawiasy [] są puste, ponieważ nie wiemy, ile argumentów pochodzi od użytkownika; int argc  argnie doIlość istnieje w tym celu: liczy, ile jest argumentów argv (chociaż lista jest zakończona z argv[argc] == NULL jako wartość wartownika).

Przeczytaj także to połączyć dla różnicy między generycznym foo() i foo(void)


3
2017-08-27 17:37



Jako deklaracja, int main() jest problematyczne; w definicji funkcji (gdy ciało jest również dostarczane), mówi, że funkcja nie przyjmuje argumentów, ale nie dostarcza prototypowej deklaracji funkcji, więc jeśli wywołasz rekursywnie main(), nie będziesz mieć możliwości wykonywania nieprawidłowych połączeń. Zazwyczaj nie jest to poważny problem! - Jonathan Leffler
Jest to absolutnie błędne dla głównej funkcji jeśli wywołujesz głuwnie gdzieś w swoim programie, co prawdopodobnie jest bardziej unikalne niż int main(){} - AProgrammer


Jeśli implementacja jednoznacznie dokumentuje int main() (bez argumentów) jako poprawny podpis, to od C99 wszystko jest w porządku (§5.1.2.2.1 ¶1, "... lub w inny sposób określony przez implementację.").

Jeśli wdrożenie nie robi udokumentować to, to ściśle rzecz biorąc zachowanie jest niezdefiniowane (§ 4 ¶2), ale szanse na to, że prowadzi do zachowania znacząco różniącego się od int main(void) z mojego doświadczenia są bardzo cholernie niskie.


2
2017-08-27 17:44





   int main() {}
   this is the standard prior to the c99 standard of main method.

   int main(void){}
   this is the standard coined by ANSI.

   int main(int argc, char* argv[]) {}     
   This is the another version of main which provides the user to pass the command line
   argument to the main method.

1
2017-08-27 17:50



int main(void) jest co najmniej 10 lat starsza niż to, co podajesz. - AProgrammer
Nie googlowałem, ale jakoś go przeczytałem - kTiwari