Вариативный макрос

Вариативный макрос — возможность препроцессором Си при помощи специального макроса объявлять поддержку различного числа аргументов.

Макрос с переменным числом аргументов был представлен в ревизии ISO/IEC 9899:1999 (C99) стандарта языка программирования Си в 1999. Также такие макросы были введены в ISO/IEC 14882:2011 (C++11) стандарта языка программирования C++ в 2011 году[1].

Синтаксис объявления

Синтаксис объявления схож с синтаксисом вариативной функции: пропуск «...» используется для обозначения того, что нуль или более аргументов могут быть переданы. При расширении макросом каждый вызов специального идентификатора __VA_ARGS__ в списке замещения макроса заменяется переданными аргументами.

Доступ к индивидуальным аргументам в списке формальных параметров не осуществляется ни по значению, ни по способу, которым они были переданы.

В gcc в списке формальных параметров макроса могут быть как обозначенные аргументы (specified arguments), так и переданные вариативно (см. пример).

Поддержка

GNU Compiler Collection, начиная с версии 3.0, C++ Builder 2006 и Visual Studio 2005 [1] поддерживают макросы с переменным числом аргументов при компиляции кода как на языке Си, так и на языке C++. Кроме того, GCC поддерживает вариативные макросы при компиляции кода на языке Objective-C.

Пример

Если требуется printf-подобная функция dprintf(), принимающая имя файла и номер строки, из которой вызывается в качестве аргумента, можно использовать следующий макрос:

void realdprintf (char const *file, int line, char const *fmt, ...); 
#define dprintf(...) realdprintf(__FILE__, __LINE__, __VA_ARGS__)

dprintf() может быть вызвана как:

dprintf("Hello, world");

который дополняется до:

realdprintf(__FILE__, __LINE__, "Hello, world");

или:

dprintf("%d + %d =%d", 2, 2, 5);

который дополняется до:

 
realdprintf(__FILE__, __LINE__, "%d + %d =%d", 2, 2, 5);

Пример неполный не отражает возможности, добавлю:

#define  CALL( _obj, _mtd, _specifiedArg1,_specifiedArg2, ... )  _obj->_mtd(_specifiedArg2,_specifiedArg1, __VA_ARGS__) 

таким образом можно манипулировать частью обозначенных аргументов, в примере аргументы поменяны местами.

Альтернативы

В некоторых случаях альтернативой вариативным макросам может служить обычный макровызов. Например, следующий код можно использовать для отладки:

#ifdef TRACING
#define TRACE(_p)	printf _p
#else
#define TRACE(_p)
#endif

Если макрос TRACING определен во время компиляции, вызов макроса TRACE будет эквивалентен вызову функции printf:

TRACE(("Выполняется строка %d\n", __LINE__));

Если макрос TRACING не был определен, во время работы программы печать сообщения выполняться не будет. Обратите внимание, что параметры вызова данного макроса должны быть заключены в двойные скобки.

В некоторых других случаях вместо вариативных макросов можно использовать функционал stdargs языков Си/C++ и вызов функции vprintf.

Другой пример:

#if defined ( DEBUG_MCU )
  #define TRACE( args ... )    printf( args )
#else
  #define TRACE( args ... )
#endif

См. также

Примечания

  1. Working draft changes for C99 preprocessor synchronization - http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1653.htm Архивная копия от 31 июля 2020 на Wayback Machine

Источники

Read other articles:

LauvLauv, 2019LahirAri Staprans Leff08 Agustus 1994 (umur 29)[1]San Francisco, California, A.S.AlmamaterNew York UniversityPekerjaan Penyanyi penulis lagu produser rekaman Tahun aktif2015–sekarangKarier musikGenre Pop[2][3] electropop[2] R&B[2] Instrumen Vokal gitar piano drum biola LabelAWALSitus weblauvsongs.com Ari Staprans Leff (lahir 8 Agustus 1994), yang dikenal secara profesional sebagai Lauv, adalah penyanyi, penulis lagu, dan p...

 

Ryunosuke KamikiNama asalKamiki Ryunosuke (神木 隆之介code: ja is deprecated )Lahir19 Mei 1993 (umur 30)Fujimi, Saitama, JepangKebangsaanJepangPendidikanHorikoshi GakuenSitus webSitus resmi Ryunosuke Kamiki (神木 隆之介code: ja is deprecated , Kamiki Ryunosuke) (lahir 19 Mei 1993) adalah seorang aktor dan pengisi suara asal Jepang. Kamiki memulai kariernya pada saat ia berumur 2 tahun dengan menjadi pengisi suara, sedangkan untuk karier sebagai aktor ia mulai pada umur 6 ...

 

Dominique Jacques de Eerens Dominique Jacques de Eerens (17 Maret 1781 – 30 Mei 1840), adalah gubernur jenderal Hindia Belanda yang ke-45. Ia memerintah antara tahun 1836 – 1840. Ia adalah satu-satunya gubernur jenderal Hindia Belanda yang dimakamkan di kompleks pemakaman di dalam Kebun Raya Bogor. Di masa kekuasaannya, para pegawai pemerintahan dipersyaratkan menguasai bahasa Melayu. Ia juga berhasil menuntaskan Perang Padri (tuntas pada tahun 1838 dengan takluknya Tuanku T...

Giuseppe Furino Furino nel 1972 alla Juventus Nazionalità  Italia Altezza 167 cm Peso 69 kg Calcio Ruolo Centrocampista Termine carriera 1º luglio 1984 Carriera Giovanili 19??-1965 Juventus Squadre di club1 1965-1966 Juventus0 (0)1966-1968→  Savona61 (7)1968-1969→  Palermo27 (1)1969-1984 Juventus361 (8) Nazionale 1970-1974 Italia3 (0) Palmarès  Mondiali di calcio Argento Messico 1970 1 I due numeri indicano le presenze e le reti segnate, per le sole ...

 

Синелобый амазон Научная классификация Домен:ЭукариотыЦарство:ЖивотныеПодцарство:ЭуметазоиБез ранга:Двусторонне-симметричныеБез ранга:ВторичноротыеТип:ХордовыеПодтип:ПозвоночныеИнфратип:ЧелюстноротыеНадкласс:ЧетвероногиеКлада:АмниотыКлада:ЗавропсидыКласс:Пт�...

 

Anne RiceRice in 2006LahirHoward Allen Frances O'Brien(1941-10-04)4 Oktober 1941New Orleans, Louisiana, Amerika SerikatMeninggal11 Desember 2021(2021-12-11) (umur 80)Rancho Mirage, California, Amerika SerikatNama pena Anne Rampling A. N. Roquelaure PekerjaanNovelistPendidikan Texas Woman's University Universitas Negara Bagian San Francisco (BA, MA) GenreGothic fictionhorrorerotic literatureChristian novelfantasyPasanganStan Rice ​ ​(m. 1961; meningga...

A city in Himachal Pradesh, India This article is about the city in India. For its namesake district, see Mandi district. City in Himachal Pradesh, IndiaMandi Choti KashiCity[[File:Natural ട്രീസ 280|99px]]From top, left to right: Victoria Bridge, Mandi town, Panchvaktra Temple & Prashar lakeNickname(s): Choti Kashi, Varanasi of HillsMandiShow map of Himachal PradeshMandiShow map of IndiaCoordinates: 31°42′25″N 76°55′54″E / 31.70694°N 76.93167°E&...

 

American actress and singer (1922–2015) Lizabeth ScottScott in 1947BornEmma Matzo(1922-09-29)September 29, 1922Scranton, Pennsylvania, United StatesDiedJanuary 31, 2015(2015-01-31) (aged 92)Los Angeles, California, United StatesOther namesElizabeth ScottOccupationsActresssingermodelYears active1942–1972Signature Lizabeth Virginia Scott (born Emma Matzo; September 29, 1922 – January 31, 2015)[1][2] was an American actress, singer and model for the Walter Th...

 

They Can't Stop the Spring Defvish interprétant They Can't Stop the Spring Chanson de Dervish Sortie 2007 Durée 3:03 Langue Anglais Genre Folk Format Single Auteur John Waters (en) Compositeur Tommy Moran Label RTÉ Chansons représentant l'Irlande au Concours Eurovision de la chanson Every Song Is a Cry for Love(2006) Irelande Douze Pointe(2008)modifier They Can't Stop the Spring (en français, Ils ne peuvent pas arrêter le printemps) est la chanson représentant l'Irlande au C...

 2   3B   6 ElizabethHalte Trans SemarangLetakKecamatanCandisariKelurahanWonotingalAlamat Jl. Sultan AgungKode pos50252Koordinat geografis7°00′29″S 110°25′01″E / 7.007920°S 110.416870°E / -7.007920; 110.416870Koordinat: 7°00′29″S 110°25′01″E / 7.007920°S 110.416870°E / -7.007920; 110.416870Informasi lainStatusBeroperasiDibuka1 Oktober 2012 (2012-10-01)Direnovasi2020[1]Konstruksi ...

 

Election in Tennessee Main article: 2000 United States presidential election 2000 United States presidential election in Tennessee ← 1996 November 7, 2000 2004 → Turnout63.03% [1] 0.26 pp   Nominee George W. Bush Al Gore Party Republican Democratic Home state Texas Tennessee Running mate Dick Cheney Joe Lieberman Electoral vote 11 0 Popular vote 1,061,949 981,720 Percentage 51.15% 47.28% County results Congressional district results Preci...

 

Suicide terrorist attack in Iraq March 2016 Hillah suicide truck bombingPart of Iraqi Civil WarLocation of Babil Governorate in IraqLocationHillah, Babil Governorate, IraqCoordinates33°23′20″N 44°27′30″E / 33.38889°N 44.45833°E / 33.38889; 44.45833DateMarch 6, 2016Attack typeMass murder Suicide attack Car bombingWeaponsTruck bombsDeaths60Injured70PerpetratorsIslamic State vteWar in Iraq (2013–2017)Battles and operations 1st Anbar 1st Fallujah 1st Northern...

Satya Titiek Atyani DjoedirSatya Titiek sebagai Wakil Bupati Barito Selatan Periode Pertama (2011–2016) Wakil Bupati Barito Selatan ke-2Masa jabatan22 Mei 2017 – 22 Mei 2022BupatiEddy Raya SamsuriMasa jabatan18 September 2011 – 18 September 2016BupatiFarid YusranPendahuluIrawansyahPenggantiPetahana Informasi pribadiLahir18 September 1956 (umur 67)SurabayaKebangsaanIndonesiaPartai politikPartai NasDemProfesiPolitisiSunting kotak info • L • B Satya...

 

1952 American Western film by Fred Zinnemann This article is about the 1952 film. For the time, see Solar noon. For other uses, see High Noon (disambiguation). High NoonTheatrical release posterDirected byFred ZinnemannScreenplay byCarl ForemanBased onThe Tin Star1947 short story in Collier'sby John W. CunninghamProduced byStanley Kramer (uncredited)Starring Gary Cooper Thomas Mitchell Lloyd Bridges Katy Jurado Grace Kelly Otto Kruger Lon Chaney Henry Morgan CinematographyFloyd CrosbyEdited b...

 

This is a list of resignations from the Second government formed by Prime Minister Theresa May. After forming a Conservative minority government on 11 June 2017, Theresa May faced a significant number of front bench resignations. These included 16 departures from the Cabinet, including three from the Great Offices of State. She experienced 60 ministerial departures with 42 of these being resignations due to disunity regarding Brexit discord. Lastly, Theresa May herself resigned on 24 July 20...

Para la revista musical, véase Rolling Stone. The Rolling Stones The Rolling Stones en el Summerfest de 2015.De izquierda a derecha: Charlie Watts, Ronnie Wood, Mick Jagger y Keith Richards.Datos generalesOrigen Londres, Inglaterra, Reino UnidoInformación artísticaGénero(s) Rock and roll,[1]​ blues rock,[1]​ rhythm and blues,[1]​ pop rock,[1]​ rock psicodélico,[1]​ pop psicodélico[1]​ Hard rockPeríodo de actividad 1962-presenteDiscográfic...

 

Positions des objets du Catalogue d'étoiles doubles de Washington dans le ciel terrestre. Le catalogue d'étoiles doubles de Washington (anglais : Washington Double Star Catalog ou WDS), est un catalogue d'étoiles doubles, maintenu par l'observatoire naval des États-Unis. Le catalogue contient les positions, les magnitudes, les mouvements propres et les types spectraux de 152 448 paires d'étoiles doubles (en date du 31 août 2020)[1]. Le catalogue inclut également les étoiles ...

 

Former railway station in Northamptonshire, England IrchesterStation remains in 2002General informationLocationIrchester, North NorthamptonshireEnglandCoordinates52°17′04″N 0°38′05″W / 52.28431°N 0.63469°W / 52.28431; -0.63469Other informationStatusDisusedHistoryOriginal companyMidland RailwayPre-groupingMidland RailwayPost-groupingLondon, Midland and Scottish RailwayKey dates1857Opened1960Closed (passenger)1965Closed (goods)Irchester railway station was bu...

American fencer Erinn Smart2004 Fencing Olympians from Peter Westbrook Foundation, Keeth Smart, Erinn Smart, Ivan Lee, and Kamara James (l-r)Personal informationBorn (1980-01-12) January 12, 1980 (age 44)Brooklyn, New York, United StatesSportSportFencing Medal record Women's fencing Representing  United States Olympic Games 2008 Beijing Foil Team Erinn Smart (born January 12, 1980[1]) is an American foil fencer who was a member of the United States fencing ream at the 2008 S...

 

Species of bacterium Azotobacter chroococcum Image of a corn field on which A. chroococcum could be used as a biofertilizer Scientific classification Domain: Bacteria Phylum: Pseudomonadota Class: Gammaproteobacteria Order: Pseudomonadales Family: Pseudomonadaceae Genus: Azotobacter Species: A. chroococcum Binomial name Azotobacter chroococcumBeijerinck 1901[1] Azotobacter chroococcum is a bacterium that has the ability to fix atmospheric nitrogen. It was discovered by Martinus B...