Więc mam 2 funkcje, które mają podobne argumenty
void example(int a, int b, ...);
void exampleB(int b, ...);
Teraz example
wywołuje exampleB
, ale jak mogę przekazać zmienne na liście argumentów zmiennych bez modyfikowania exampleB
(ponieważ jest to już używane w innym miejscu).
c++
variadic-functions
Niedostępne
źródło
źródło
Odpowiedzi:
Nie możesz tego zrobić bezpośrednio; musisz stworzyć funkcję, która przyjmuje
va_list
:źródło
, ...
podpisem. Jeśli przekonwertowałeś zmienne argumenty na ava_list
, możesz przekazaćva_list
inną funkcję, która przyjmuje tylko ava_list
, ale ta funkcja (lub taka, którą wywołuje) musi mieć jakiś sposób na sprawdzenie, co jest wva_list
.Może tutaj wrzucisz kamień do stawu, ale wydaje się, że działa całkiem nieźle z szablonami wariadycznymi C ++ 11:
Przynajmniej działa z
g++
.źródło
args...
powinieneś stworzyć wersje tych funkcji, które pobierają va_list i przekazują je. Spójrz na
vprintf
przykład:źródło
Chciałem też zawinąć printf i znalazłem tutaj pomocną odpowiedź:
Jak przekazać zmienną liczbę argumentów do printf / sprintf
W ogóle nie byłem zainteresowany wydajnością (jestem pewien, że ten fragment kodu można ulepszyć na wiele sposobów, nie krępuj się :)), to jest tylko do ogólnego debugowania, więc zrobiłem to:
których następnie mogę użyć w ten sposób
C ++ ostreams są piękne w niektórych aspektach, ale praktycznie stają się przerażające, jeśli chcesz wydrukować coś takiego z kilkoma małymi ciągami, takimi jak nawiasy, dwukropki i przecinki wstawione między liczby.
źródło
Nawiasem mówiąc, wiele implementacji C ma wewnętrzną odmianę v? Printf, która IMHO powinna być częścią standardu C. Dokładne szczegóły są różne, ale typowa implementacja akceptuje strukturę zawierającą wskaźnik funkcji wyjściowej znakowej i informację mówiącą, co ma się stać. Dzięki temu printf, sprintf i fprintf mogą używać tego samego mechanizmu „rdzenia”. Na przykład vsprintf może wyglądać następująco:
Następnie funkcja core_printf wywołuje p_inf-> func dla każdego znaku do wyprowadzenia; funkcja wyjściowa może następnie wysłać znaki do konsoli, pliku, ciągu lub czegoś innego. Jeśli implementacja ujawnia funkcję core_printf (i jakikolwiek mechanizm konfiguracji, którego używa), można ją rozszerzyć o różne rodzaje odmian.
źródło
Możliwym sposobem jest użycie #define:
źródło
Opierając się na komentarzu, który pakujesz
vsprintf
i który jest oznaczony jako C ++, sugerowałbym, aby nie próbować tego robić, ale zmień interfejs, aby zamiast tego używał C ++ iostreams. Mają zalety w stosunku doprint
linii funkcji, takich jak bezpieczeństwo typów i możliwość drukowania elementów,printf
które nie byłyby w stanie obsłużyć. Niektóre poprawki teraz mogą zaoszczędzić znacznej ilości bólu w przyszłości.źródło
Korzystając z nowego standardu C ++ 0x, możesz to zrobić za pomocą szablonów wariadycznych, a nawet przekonwertować stary kod na nową składnię szablonu bez przerywania czegokolwiek.
źródło
To jedyny sposób, aby to zrobić ... i najlepszy sposób, aby to zrobić.
źródło