Rozważ zastosowanie następującego programu. Czy spowoduje to błędy kompilacji?Jakie jest uzasadnienie wstępnych definicji w C?
#include <stdio.h>
int s=5;
int s;
int main(void)
{
printf("%d",s);
}
Na pierwszy rzut oka wydaje się, że kompilator podaje błąd redefinicji, ale program jest całkowicie poprawny zgodnie ze standardem C. (Zobacz prezentację na żywo tutaj: http://ideone.com/Xyo5SY).
Wstępna definicja to dowolna zewnętrzna deklaracja danych, która nie ma specyfikatora klasy pamięci i żadnego inicjalizatora.
C99 6.9.2/2
Oświadczenie o stwierdziliśmy er dla obiektu, który ma fi l zakres bez inicjatora i bez magazynowania klasy, określonym ER lub z magazynowania klasy, określonym er statycznego stanowi wstępną definicję. Jeżeli jednostka tłumaczeniowa zawiera jedno lub więcej wstępnych definicji dla identyfikatora , a jednostka tłumaczeniowa nie zawiera żadnej zewnętrznej definicji dla tego identyfikatora, to zachowanie to jest dokładnie tak, jak jednostka tłumaczenia zawiera deklarację zakresu pliku tego identyfikatora, z typu kompozyt na koniec jednostki tłumaczeniowej, z inicjatora równa 0.
Moje pytanie brzmi, co jest uzasadnieniem dla pozwalając definicje wstępne? Czy jest jakieś wykorzystanie tego w C? Dlaczego C zezwala na wstępne definicje?
nie sądzę są tam jakieś cenne powody, bo C++ sam nigdy nie miał, wśród wielu inne języki programowania. – edmz