Wśród typów funkcji dostarczonych przez ten język są funkcje „variadic”. Te typy funkcji mają elastyczność, aby zawierać dynamiczną lub zmienną liczbę argumentów wejściowych.
W tym Wskazówka Linux Artykuł, VA_ARG Makro, który jest podstawowym elementem tego typu funkcji i jest używany do pobierania danych z argumentów wejściowych, jest szczegółowo wyjaśniony.
Zobaczymy szczegółowe wyjaśnienie jego działania i składni. Następnie umieścimy to, czego nauczyliśmy się w praktyce w praktycznym przykładzie, w którym stworzymy funkcję zmienadową krok po kroku z fragmentami kodu i obrazami, które pokazują, jak VA_ARG Makro działa w języku C.
Składnia makro VA_ARG
Typ VA_ARG (VA_LIST AP, typ)Definicja funkcji zmiennej
Zanim przejdziemy bardziej szczegółowo o makro VA_ARG, Rzućmy okiem, czym jest funkcja zmienna.
Funkcje te nie mają stałej liczby argumentów wejściowych, ale liczba tych argumentów jest dostosowana do tego, co programista wysyła z każdym połączeniem.
Przykładem tego jest powszechnie używana funkcja variatyczna printf (), której argumenty wejściowe mogą być tylko ciągiem, ciągiem i zmienną lub wskaźnikiem lub kilkoma z nich.
Następnie zobaczymy, jak zdefiniować funkcję zmienadową:
Typ funkcja (Zmienna typu,…);Jak widzimy w definicji, podczas tworzenia funkcji tego typu musimy określić w jej deklaracji co najmniej jeden zadeklarowany argument wejściowy i jego typ, a następnie elipsy oddzielona przecinkami reprezentująca zmienną lub nieznane argumenty.
Zmienne i makra, które używają funkcji zmiennych, takich jak VA_ARG, są zdefiniowane w „stdarg.H ”nagłówek. Aby ich użyć, musimy je uwzględnić w naszym „.Kod C ”lub jego nagłówek w następujący sposób:
#włączaćNastępnie sprawdźmy szczegółowo na to, o co chodzi w makrach, które składają się.
Argumenty wejściowe i makra funkcji zmiennej
W funkcjach zmiennych, do przetwarzania argumentów wejściowych wysyłających argumenty wejściowe wysyłają argumenty wejściowe, które programista wysyła. Te makra i ich użycie w funkcji pokazano poniżej.
va_list apObiekt AP jest typu VA_LIST i przechowuje informacje o argumentach wejściowych. Następnie wskazuje na bieżącą pozycję w kolejności pobierania danych wejściowych listy.
Po ogłoszeniu obiekt VA_LIST musi zostać zainicjowany za pomocą makra VA_START.
void va_start (va_list ap, last);Makro VA_Start jest nazywany najpierw, gdy wywoływana jest funkcja zmienna. Inicjuje obiekt AP, który wskazuje na pierwszy nieznany argument na liście.
typ va_arg (va_list ap, typ);To makro zwraca następny argument wejściowy wskazany przez AP z listy argumentów. Zwracany typ danych jest określony w typu.
Gdy tylko VA_ARG odzyskuje dane, AP zwiększa swoją wartość poprzez odniesienie do następnego argumentu wejściowego.
To makro nie zwraca wartości domyślnej wskazującej, że lista argumentów wejściowych osiągnęła koniec. Tak więc programista musi upewnić się, że generowana jest bezpieczna metoda wskazująca, czy na liście nadal istnieją argumenty, które można wyodrębnić, czy nie.
Bezpieczna metoda składa się z włączenia do każdego wywołania funkcji zmiennej, stałej i unikalnej wartości, którą można interpretować w korpusie funkcji jako wskaźnik „nie więcej parametrów” w ostatnim parametrze wejściowym.
void va_end (va_list ap);Po pobraniu wszystkich argumentów każdy cykl VA_START musi zostać zakończony z VA_END, zanim funkcja wariadyczna powróci. W przeciwnym razie istnieją informacje o stosie z danymi bieżącego wywołania, co może prowadzić do błędów w następnym wywołaniu funkcji
Widzieliśmy już każdy z makr, które są częścią pobierania argumentów w funkcji zmiennej. Teraz zobaczmy przykład, w jaki sposób korzystanie z VA_ARG Makro w celu pobrania danych z argumentów wejściowych jest zaimplementowane w tego typu funkcji.
Jak utworzyć funkcję zmienną krok po kroku i pobrać jej argumenty wejściowe za pomocą makro va_arg () w języku c
W tym przykładzie wyjaśniamy krok po kroku, jak utworzyć funkcję zmienadową i pobrać jej argumenty wejściowe - za pomocą makra VA_ARG.
W pierwszym etapie tworzymy funkcję zmienadową, którą wywołamy get_arguments ().
Zarówno wyjście, jak i zadeklarowany argument wejściowy Arg_1 będzie typu podwójnego. Oświadczenie będzie wyglądać tak:
podwójne get_arguments (podwójne arg_1,…);Po ogłoszeniu funkcji za pomocą jej typów wyjściowych i wejściowych kontynuujemy rozwój ciała funkcyjnego.
W następnym kroku utworzymy tablicę 10 elementów typu podwójnego z nazwą get_arg. W tej tablicy będziemy przechowywać dane argumentu wejściowego, które odzyskujemy za pomocą makra VA_ARG.
Utworzymy również zmienną „a”, która jest typu int i będzie służyć jako identyfikator elementów tablicy get_arg.
Double Get_ARG [10];W następnym kroku tworzymy obiekt typu VA_LIST, który nazywamy „AP”.
Ten obiekt jest inicjowany z makro_startem i przechodzi jako pierwszy argument, nazwa wcześniej utworzonego obiektu „AP”; i jako drugi argument nazwa ostatniej znanej zmiennej wejściowej, w tym przypadku „arg_1”.
va_list ap;Należy zauważyć, że pierwszy argument, aw tym przypadku jedyny znany przez funkcję, nie jest zawarty na liście „AP”, więc jego odzyskiwanie odbywa się w taki sam sposób, jak w przypadku funkcji niewiaryjnej.
W takim przypadku przechowujemy go w elemencie nr 1 tablicy get_arg.
get_arg [a] = r1;Następnie utwórz pętlę, aby pobrać argumenty wejściowe za pomocą makra VA_ARG.
W tej pętli powtórz to, aż makro VA_ARG nie otrzyma wartości -1 lub „e”, co będzie wskaźnikiem „ostatniego argumentu”.
W każdym cyklu pętli komunikat „Argument odzyskany:” jest wydrukowany przez funkcję printf (), a następnie wartość pobranych danych.
Następnie identyfikator „A” jest zwiększany o 1, a makro VA_ARG nazywany jest, który pobiera następny argument wejściowy i przechowuje go w elemencie tablicy get_arg, do którego odwołuje się „a”.
While (get_arg [a] != e)Kiedy wszystkie dane zostały pobrane, a program opuścił pętlę, musimy wyjść z obiektu listy „AP”, który utworzyliśmy na początku funkcji z makro VA_END i przekazać nazwę tego obiektu jako argument wejściowy.
va_end (ap);Następnie zobaczymy pełny kod dla funkcji zmiennej, którą właśnie utworzyliśmy, oraz główny, w którym można wywołać funkcję i zadeklarować zmienne typu podwójnie, które wyślemy jako argumenty wejściowe.
#włączaćPoniższy obraz pokazuje konsolę poleceń z pobieranymi argumentami wejściowymi. W takim przypadku funkcja została wywołana z dwoma argumentami wejściowymi.
Dane pobierane dla połączenia z pięcioma argumentami wejściowymi.
Problemy i rozwiązania w celu pobierania danych wejściowych z VA_ARG Makro
Głównym problemem, którym napotkamy podczas opracowania funkcji zmiennej, jest to, że makro VA_ARG nie ma metody informowania programistów o końcu listy argumentów wejściowych. Tak więc po pobraniu wszystkich danych wysłanych w połączeniu, to makro zwróci błędne wyniki za każdym razem, gdy nazywa się to nieokreślone
Oznacza to, że nie tylko uzyskasz nieprawidłowe wyniki, ale w przypadkach, w których pobieranie danych jest zapętlone, pojawi się przepełnienie. Dlatego programista musi wymyślić metodę wykrycia końca argumentów na liście. Jedną z metod może być użycie stałej jako ostatniego argumentu wskazującego koniec listy.
Inną metodą jest określenie jako pierwszy argument liczba parametrów, które należy wysłać za każdym razem, gdy wywoływana jest funkcja zmienna.
Wniosek
W tym lWskazówka inux Artykuł, podaliśmy szczegółowe i pełne wyjaśnienie, jak działają funkcje variatyczne i jak korzystać z VA_ARG Makro w języku C.
Wyjaśniliśmy również szczegółowo użycie innych makr, które są częścią odzyskiwania danych w tego rodzaju funkcji i pokazaliśmy, jak zadeklarować i opracować jeden z nich, które są bardzo ważnym zasobem w tym i innych językach programowania. Można znaleźć więcej takich artykułów w wyszukiwarce Linux wskazówek.