Wpis z mikrobloga

@RicoElectrico: Nie sprawdza tego. Na poziomie linkera masz już assembler i jak przekażesz złe argumenty, to możesz mieć segfault.

Przy okazji sprostuję poprzedni wpis. Zapomniałem, że C nie ma przecież przeładowań funkcji, więc jak drugi raz zadeklarujesz tę funkcję, to wszystko się skompiluje i zlinkuje, ale możesz mieć segfaulta.
@ponton: Zrobiłem test z GCC i wiesz co? Ci idioci nawet tego nie sprawdzają ( ͡ ͜ʖ ͡)
Program działa "ok" ( ͡° ͜ʖ ͡°)

main.c

#include
void doSomething(void);
int main (){
puts("o hai");
doSomething();
return 0;
}

second.c

#include
void doSomething(int nothing){
puts("no elo");
}

$ gcc main.c second.c
$ ./a.out
o hai
no elo
@Kicer86: Linker wywali błąd kiedy w co najmniej dwóch plikach .o ma dwa takie same symbole silne (zdefiniowaną funkcję lub zainicjalizowaną zmienną globalną). Jeżeli ma dwa lub więcej symboli słabych to wybierze dowolny z nich (może powodować bugi).
@Kicer86: nie chodziło w nim o podwójne symbole, a o różne argumenty / zwracany typ. Normalnie przed tą sytuacją chronią pliki .h które są dołączane zarówno w pliku z definicją funkcji, jak i pliku gdzie zostaje wywołana. Kompilator wyłapałby niezgodność deklaracji.
@RicoElectrico: w c, jak już zostało powiedziane, symbole nie przechowują informacji o typach. Ma to pewne zalety - łatwiej zlinkować pliki .o wygenerowane przez różne kompilatory i wygenerowane z różnych języków programowania. Np w c++ jest inaczej.