2013-03-09 11 views
5

Co naprawdę się stało, gdy mogę skompilować:Co tak naprawdę się dzieje, gdy kompiluję int main; w C

int main; 

Czy to nie powinno być main() i spowodował błąd?

Próbowałem skompilować kod w CodeBlocks i skompilowałem go idealnie bez błędu.

+5

Czy nie wystarczy zadeklarować całkowitą o nazwie 'main'? – Rob

+0

@Rob Jednak gdy próbowałem uruchomić "int x;" CodeBlocks daje mi ten błąd: niezdefiniowane odwołanie do 'WinMain @ 16 ' –

+1

Możesz na pewno uruchomić swój program, chociaż niektóre kompilatory rzucają ostrzeżenie, jeśli deklarujesz zmienną o nazwie 'main':' warning: 'main' jest zwykle funkcją ' – Rob

Odpowiedz

6

To nie jest błąd, ponieważ plik źródłowy C nie musi mieć funkcji main i można zdefiniować main jako dowolne, o ile nie spróbujesz zdefiniować go dwa razy w tym samym zasięgu. Ponieważ jest to cały twój program, wszystko jest w porządku - ale program z pewnością nie będzie działał poprawnie, ponieważ nie ma funkcji, którą można znaleźć.

Wszystko, co robi, to deklaracja globalnej (zewnętrznej) zmiennej o nazwie main, zainicjowanej do 0. Linker normalnie wystawiłby błąd, jeśli go tam nie ma, ale może być zadowolony z obecności zmiennej zewnętrznej (spodziewam się, że to założenie to wskaźnik).

EDYTOWANIE: Zajrzałem do tego trochę z debuggerem, i na pewno main ma wartość 0, tj. Zmienna jest używana jako wskaźnik bez rzutowania. Tak więc kod inicjalizacyjny próbuje uruchomić funkcję znajdującą się pod adresem 0, powodując uszkodzenie na mojej platformie.

3

Myślę, że jesteś zdezorientowany z powodu niewłaściwego (lub braku zrozumienia) zakresu.

Kiedy mówisz tutaj, deklaracja int main; jest przekazywana przez kompilator, zakładam, że deklarujesz to w zasięgu funkcji. Ale jeśli spróbujesz zadeklarować go w zasięgu globalnym, kompilator zgłosi błąd redefinicji.

Tak długo, jak nie masz dwóch identycznych identyfikatorów w tym samym zakresie, kompilator będzie zadowolony i pozwoli ci na to.

Poniższy kod da błąd redeinition:

int main; 

int main() 
{ 
    printf("In main\n"); 
} 

Poniższy kod nie będzie, ponieważ zakres główny jest ograniczony tylko wewnątrz funkcji i kompilator uzna zmienną int main i wynik jest drukowany jako 5.

int main() 
{ 
    int main = 5; 
    printf("In main, value of main is %d\n", main); 
} 

poniższy kod jednak wypisze adres głównego

int main() 
{ 
     printf("In main, value of main is %d\n", main); 
} 

EDIT: Po przeczytaniu uwag, czuję się kluczowym problemem jest to, że nie ma w ogóle głównej funkcji, które należy mieć na program „C”, aby rozpocząć pracę. Jeśli nie masz głównej funkcji, ale po prostu zadeklaruj zmienną int main;, Twój kod może nadal się kompilować, ale kiedy wykonasz, będzie zamieszanie i chaos, ponieważ główna jest zmienną całkowitą, podczas gdy oczekuje się, że będzie to funkcja. Ale tak długo, jak utrzymujesz swoje główne (e) pod kontrolą, jak na powyższą odpowiedź, powinieneś zrobić dobrze.

Możesz iść this odnośnik, który wyjaśnia koncepcję opracowania i realizacji programu C

+1

Z komentarzy, to cały program, tj. Nie ma głównej funkcji. – teppic

+0

@teppic, :). Powinienem był uważniej przeczytać to pytanie. – Jay

Powiązane problemy