Przeciążanie funkcji w C - możliwe?

0

Witam,

Mam problem z następującym kodem:

double oblicz (double x, int nMin, int nMax);
double oblicz (double x, int nMin);
double oblicz (double x);

Niestety, kompilator wywołuje błąd:

main.c|15|error: conflicting types for 'oblicz'|

W C nie ma możliwości przeciążania funkcji?

2

Dopiero w C++

2

W C nie ma przeciążania funkcji.

0

No i dziękuję serdecznie.

Zastanawiam się zatem, po co uczyć tak beznadziejnego, archaicznego i bezużytecznego języka...

1

IFy, varargs albo http://stackoverflow.com/questions/9179940/does-c-support-optional-null-parameters ?

Widziałeś składnie C++ czy Javy albo to https://github.com/torvalds/linux/tree/master/kernel ? Pff.. jak można tak obrażać C... poczytałbyś trochę a nie.

2

„problem” można rozwiązać dodając sufiksy do nazwy funkcji.
przykład z OpenGL:

void glVertex2i(int x, int y);
void glVertex3f(float x, float y, float z);
void glVertex3d(double x, double y, double z);
void glVertex3iv(const int *v);

Gdzie gl to przedrostek wszystkich funkcji z biblioteki, Vertex to właściwa nazwa funkcji, a potem idą sufiksy: 2i oznacza „dwa inty”, 3f „trzy floaty” i tak dalej. Dzięki temu funkcje mają różne nazwy, ale po zapamiętaniu prostego schematu łatwo odgadnąć nazwę potrzebnej funkcji tak „przeciążonej”.

Kompilator C++ robi za nas to samo automatycznie, zmieniając twoje double oblicz na jakieś double __AK47_mUmBo_JuMbO_oblicz_123. Dzięki temu na poziomie binarnym funkcje przeciążone mają różne nazwy, nawet jeśli w kodzie źródłowym mają takie same.

0

A nie możesz nadać nmin i nmax wartości domyślnych? Zawsze możesz zrobić coś takiego

 
double oblicz (double x, int nMin = 0, int nMax = 0);

Wtedy jak wywołasz z liczbą argumentów mniejszą niż 3, to pozostałe przyjmą wartości domyślne.

0

Wydaje mi się że jeżeli tylko nie masz z góry narzucone że to ma być c to możesz pisać pod c++ bo to w końcu nadzbiór c więc spokojnie możesz pisać "kod c" i tam gdzie potrzebujesz czegoś więcej używasz możliwości c++.

1 użytkowników online, w tym zalogowanych: 0, gości: 1