2010-10-17 16 views
16

Wpadłem na to pytanie podczas pisania man 2 open. Mówi, że istnieją dwa rodzaje otwartych, jeden z dwoma argumentami i jeden z trzema! Ostatnim razem, gdy sprawdziłem, nie mogliśmy przeciążyć funkcji w C. Jak oni to zrobili? czy napisali w C++?Dlaczego "człowiek 2 otwarty" mówi, że istnieją dwa rodzaje otwartych?

int open(const char * pathname, int flags); 
int open(const char * pathname, int flags, mode_t mode); 

Odpowiedz

19

Nie, po prostu użyły funkcji variadic.

int open(const char * pathname, int flags, ...); 

To czyni ostatni argument opcją mode opcjonalną. Prototypy pokazują jedynie, w jaki sposób należy korzystać z tej funkcji, a nie faktyczny interfejs.

Oczywiście, w przeciwieństwie do realnego przeciążenia, kompilator nie może wpisać zaznaczenie mode argumentu, więc użytkownik musi być bardzo ostrożny, aby zapewnić tylko 2 lub 3 argumenty są przekazywane, a 3rd argument musi być mode_t.


BTW, jeśli sprawdzeniu man 2 open dla BSD (w tym OS X) to pokazuje correct prototype as above.

+1

Jeśli kompilator zna POSIX lub zapoznał się z typami argumentów funkcji za pomocą jakiegoś rozszerzenia języka, może przeprowadzić sprawdzanie. Jeśli gcc/glibc jeszcze tego nie robi, nie zdziwiłbym się, gdyby dodali go wkrótce, tak jak sprawdza się argument "printf". –

+0

Dzięki, to naprawdę pomogło. –

7

Nie, napisali w C, używając varargs.

Zapoznaj się z stdarg.h, gdzie znajdują się przykłady.

Funkcja variadic może czytać tyle argumentów, ile chce, od ellipsis. Wszelkie dodatkowe argumenty funkcji "nie chce" są w rzeczywistości odrzucane.

8

Co jest warte, strona podręcznika jest niepoprawna. Prototypy to pokazuje:

int open(const char * pathname, int flags); 
int open(const char * pathname, int flags, mode_t mode); 

nie równoważna prawidłowej prototype:

int open(const char * pathname, int flags, ...); 

Używanie nieprawidłowych te zapewniane przez niego (np jeśli prototyp funkcji samodzielnie, zamiast w tym prawo nagłówka) spowoduje, że twój program będzie miał niezdefiniowane zachowanie. (I to nie jest tylko teoretyczne, prawdopodobnie nie będzie działać na platformach x86_64 i innych platformach z ABI typu pass-by-register.)

To, co strona man próbowała wyrazić (i robi bardzo słabą pracę) to że część variadic listy argumentów open może być pusta lub pojedynczy argument typu mode_t, gdzie brak lub obecność opcjonalnego argumentu zależy od wartości flags.

Powiązane problemy