2013-03-22 8 views
11

Próbowałem następujący kod:W C, dlaczego nie otrzymam błędu, gdy zadeklaruję zmienną globalną w innym typie danych w innym pliku?

File1.c:

int x; 

File2.c:

extern char x; 
main() 
{ 
    x=10; 
    .... 
    .... 
} 

i skompilowany jako

$ gcc File1.c File2.c

i nie dostałem żadnego błędu, ale oczekiwałem jednego.

+1

Skompiluj z '-Wall' i zobacz, czy dostaniesz ostrzeżenia –

+0

możliwy duplikat [Czym są zewnętrzne zmienne w C?] (Http://stackoverflow.com/questions/1433204/what-are -extern-variables-in-c) – mensi

+4

* Z wielką mocą jest wielka odpowiedzialność * – UmNyobe

Odpowiedz

18

W File.c obiecujesz kompilatorowi, że x ma typ char. Ponieważ każda jednostka tłumaczeniowa jest kompilowana osobno, kompilator nie ma możliwości zweryfikowania tego i przyjmuje twoje słowo. Łącznik nie wykonuje żadnej kontroli typów. Otrzymujesz nieprawidłowy program, który tworzy się bez błędów.

Dlatego należy używać plików nagłówkowych. Jeśli File1.c i File2.c oba otrzymają deklarację extern z x z tego samego nagłówka, wówczas wystąpi błąd podczas kompilowania File1.c (ponieważ definicja nie pasuje do deklaracji). [Wskazówka kapelusza @SteveJessop]

+0

To wszystko. A ponieważ 10 jest zarówno poprawnym 'int', jak i poprawnym' char', kompilacja działa dobrze. – Fabien

+0

Dziękuję Steve za wyjaśnienie mi tego .. Ale jestem ciekawy i teraz zainicjowałem zmienną globalną x jako char w pliku1 i zadeklarowałem ją jako int w pliku2 i ustawiłem wartość 1000, której nie można obsłużyć i wydrukować. .By twoje wyjaśnienie teraz oczekuję błędu czasu wykonywania i nie dostałem jednego .. – Adi

+1

@BillHicks: Zachowanie twojego kodu jest niezdefiniowane (http://en.wikipedia.org/wiki/Undefined_behavior). Nie musi się on zawieszać ani powodować błędu runtime. Jest on wolny od wad (lub nie) w inny sposób. – NPE