Chodzi o to, że jak w C nazwiesz funkcję foo, to taki ona ma symbol w dalszej obróbce przez kompilator. W C++ jest inaczej. W C++ mamy przeładowanie nazw funkcji. Mogą być dwie funkcje o takiej samej nazwie, jeżeli różnią się parametrami. C++ pod spodem organizuje ten mechanizm w ten sposób, że do nazwy funkcji dokleja typy parametrów. Czyli funkcja w C foo ma nazwę podczas budowania foo. Funkcja foo w C++, która przyjmuje dwa inty, będzie się nazywać w trakcie budowania np. foo_int_int.
I teraz załóżmy, że masz bibliotekę zbudowaną kompilatorem języka C. Jest w tej bibliotece funkcja o nazwie foo. Piszesz kod w C++ i chcesz zawołać taką funkcję do pracy. Jeżeli nie powiesz kompilatorowi C++, że to funkcja z języka C, to on spróbuje wołać funkcję po swojemu, czyli będzie szukał foo_int_int. Nie uda mu się to, bo takiej funkcji nie ma, (jest foo), i zgłosi błąd. Możesz jednak powiedzieć mu, że foo pochodzi z innego świata, w którym nie dekoruje się nazw :)
extern "C" void foo(int a, int b);