2012-08-27 21 views
9

Powiel możliwe:
Standard way to define parameter-less function main() in CDefinicja głównego() w C

mogę używać deklaracji definicji funkcji main() w C, która wygląda następująco:

int main() {} 

Tak, widziałem, że standard mówi, że są one y dwa gwarantowane wspierane wersje:

int main(void) {} 

i

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

ale co z pustymi paratheses? 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 tą definicją deklaracji.

Więc kto się myli?

+2

Odpowiedź jest krótka: „prawdopodobnie można uciec z nim, ponieważ kompilator jest chyba na dość łagodnej ustawienia, ale w tym samym czasie prawdopodobnie nie należy próbować, bo to łagodnie źle, przenośności szkodzi nieznacznie może wywoływać ostrzeżenia kompilatora i nie przynosi żadnych korzyści. " – fennec

Odpowiedz

9

W C, istnieje różnica między deklaracjamiint main(); i int main(void);(dawna deklaruje funkcję z numerem nieokreślony argumentów, a drugi faktycznie nazywa się proto ­ typ). Jednakże w funkcji , definicja, zarówno main(), jak i main(void) definiują funkcję, która przyjmuje argumenty w postaci .

Drugi podpis, main(int, char**), jest formularzem alternatywnym. Zgodne implementacje muszą akceptować obie formy, ale mogą również akceptować inne podpisy zdefiniowane w ramach implementacji dla main(). Dany program może oczywiście zawierać tylko jedną pojedynczą funkcję o nazwie o nazwie main.

+0

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, każdy z punktów na ciąg , który dostarcza informacji o środowisku dla tego wykonania programu (5.1.2.2.1) ._ –

+0

to nie jest twoje pierwsze zdanie: 'main()' przyjmuje nieznaną liczbę argumentów; tylko 'main (void)' nie przyjmuje argumentów – Federico

+2

Warto zauważyć, że podczas gdy 'int main() {...}' jak definiuje rzeczywiście definiuje funkcję bez argumentów, to jednak samo w sobie nie wprowadza prototypu dla 'główne'. To znaczy. po takiej definicji 'główny' jest nadal * zadeklarowany * jako funkcja o nieokreślonych parametrach. "Brak argumentów" wpływa tylko na ciało "głównego". – AnT

3

int main() i jakakolwiek inna funkcja taka jak ta, przyjmuje nieznaną liczbę argumentów, więc jest to absolutnie błędne dla funkcji głównej. int main(void) nie przyjmuje żadnych argumentów.

char* argv[] jest arg ument v ector. Kiedy piszesz argument w wierszu poleceń, znajdziesz argumenty w tym wektorze ciągów. Czasami można również znaleźć char **argv, ale jest taki sam. Nawiasy [] są puste, ponieważ nie wiemy, ile argumentów pochodzi od użytkownika; W tym celu istnieje liczba: argv (chociaż lista jest również zakończona z argv[argc] == NULL jako wartością wartownika).

Czytaj także ten link różnicę między rodzajowy foo() i foo(void)

+1

Jako deklaracja, 'int main()' jest problematyczne; w definicji funkcji (gdzie ciało jest również dostarczane), mówi, że funkcja nie przyjmuje argumentów, ale nie dostarcza prototypowej deklaracji funkcji, więc jeśli rekursywnie wywołasz 'main()', nie zostaniesz powstrzymany od wykonywania nieprawidłowych połączeń. Zazwyczaj nie jest to poważny problem! –

+0

_Nie jest to absolutnie złe dla głównej funkcji_, jeśli wyraźnie wywołujesz głoszenie gdzieś w twoim programie, co prawdopodobnie powinno raczej ominąć niż 'int main() {}' – AProgrammer

1

Jeśli realizacja jawnie dokumenty int main() (bez argumentów) jako ważnego podpisu, a następnie jako od C99 wszystko jest w porządku (§ 5.1.2.2.1 ¶ 1, "... lub w inny określony przez implementację sposób.").

Jeśli realizacja nie dokument, a potem ściśle mówiąc zachowanie jest niezdefiniowane (2), ale szanse na to prowadzące do zachowania istotnie różne od int main(void) są, w moim doświadczeniu, całkiem cholernie niskie .

1
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. 
+0

'int main (void)' jest co najmniej 10 lat starsze niż stwierdzasz. – AProgrammer

+0

Nie zrobiłem tego, ale w jakiś sposób przeczytałem – kTiwari