C预处理器

C预处理器是C语言、C++语言的预处理器。用于在编译器处理程序之前预扫描源代码,完成头文件的包含,巨集扩展,条件编译英语conditional compilation,行控制(line control)等操作。

编译阶段

C语言标准规定,预处理是指前4个编译阶段(phases of translation)。

  1. 三字符组与双字符组的替换
  2. 行拼接(Line splicing): 把物理源码行(Physical source line)中的换行符转义字符处理为普通的换行符,从而把源程序处理为逻辑行的顺序集合。
  3. 单词化(Tokenization): 处理每行的空白、注释等,使每行成为token的顺序集。
  4. 擴展巨集与预处理指令(directive)处理。

包含文件

用于包含另一个文件:

#include <stdio.h>

int main(void)
{
    printf("Hello, world!\n");
    return 0;
}

条件编译

if-else指令包括#if, #ifdef, #ifndef, #else, #elif and #endif .

#if VERBOSE >= 2
  print("trace message");
#endif

#ifdef __unix__ /* __unix__ is usually defined by compilers targeting Unix systems */
# include <unistd.h>
#elif defined _WIN32 /* _WIN32 is usually defined by compilers targeting 32 or 64 bit Windows systems */
# include <windows.h>
#endif


#if !(defined __LP64__ || defined __LLP64__) || defined _WIN32 && !defined _WIN64
	// we are compiling for a 32-bit system
#else
	// we are compiling for a 64-bit system
#endif


巨集定義與擴展

有两种巨集:

  • 类似对象的巨集(无参数的巨集)
  • 类似函数的巨集(带参数的巨集),在第一个标识符与左括号之间,绝不能有空格。
#define <identifier> <replacement token list>                    // object-like macro
#define <identifier>(<parameter list>) <replacement token list>  // function-like macro, note parameters

宏定义可以用#undef取消:

#undef <identifier>                                              // delete the macro

特殊巨集与指令

__FILE____LINE__, 扩展为当前文件与行号。例如:

// debugging macros so we can pin down message origin at a glance
#define WHERESTR  "[file %s, line %d]: "
#define WHEREARG  __FILE__, __LINE__
#define DEBUGPRINT2(...)       fprintf(stderr, __VA_ARGS__)
#define DEBUGPRINT(_fmt, ...)  DEBUGPRINT2(WHERESTR _fmt, WHEREARG, __VA_ARGS__)
//...

  DEBUGPRINT("hey, x=%d\n", x);

C或C++语言标准定义了巨集: __STDC__, __STDC_VERSION__, __cplusplus,__DATE__,__TIME__,__func__等。

Token字符串化

#运算符(Stringification Operator)把随后的token转化为C语言的字符串。

#define str(s) #s

str(p = "foo\n";) // outputs "p = \"foo\\n\";"
str(\n)           // outputs "\n"

即使#运算符后面的是另一个巨集名,这个宏名将不会被巨集展开,而是按照字面值被当作一个字符串。因此,如果需要#运算符后面的巨集名做巨集展开,需要使用两层巨集的嵌套使用,其中外层的巨集展开时也一并把#运算符后面的巨集名做巨集展开。例如:

#define xstr(s) str(s)
#define str(s) #s
#define foo 4

str (foo)  // outputs "foo"
xstr (foo) // outputs "4"

Token连接

##运算符(Token Pasting Operator)连接两个token为一个token.

#define DECLARE_STRUCT_TYPE(name) typedef struct name##_s name##_t

DECLARE_STRUCT_TYPE(g_object); // Outputs: typedef struct g_object_s g_object_t;

##运算符左侧或右侧如果是另一个巨集名,这个宏名将不会被巨集展开,而是按照字面值被当作一个token。因此,如果需要##运算符左右的巨集名做宏展开,需要使用两层巨集的嵌套使用,其中外层的巨集展开时也一并把##运算符左右的巨集名做宏展开。

用户定义的编译错误与警告

#error "error message"
#warning "warning message"

编译器相关的预处理特性

#pragma指令提供了编译器特定的预处理功能。

参考文献

外部链接

Read other articles:

Provinsi Mino (美濃国code: ja is deprecated , mino no kuni) adalah provinsi lama Jepang yang sekarang menjadi bagian selatan prefektur Gifu. Mino berbatasan dengan provinsi Echizen, Hida, Ise, Mikawa, Omi, Owari, dan Shinano. Ibu kota Mino terletak di kota Tarui, sedangkan istana penguasa terletak di kota Gifu. Mino merupakan wilayah kekuasaan Oda Nobunaga yang diteruskan oleh para pewarisnya sewaktu Toyotomi Hideyoshi berkuasa. Pertempuran Sekigahara terjadi di bagian barat Mino, tepatny...

 

Overview about the media censorship and disinformation during the Gezi Park protests This article's lead section may be too short to adequately summarize the key points. Please consider expanding the lead to provide an accessible overview of all important aspects of the article. (March 2021) The 2013 Gezi Park protests in Turkey saw massive amounts of censorship and disinformation by the mainstream media,[1] especially by those supporting Prime Minister Recep Tayyip Erdoğan and his J...

 

Elang perut-karat Lophotriorchis kienerii Status konservasiHampir terancamIUCN22696111 TaksonomiKerajaanAnimaliaFilumChordataKelasAvesOrdoAccipitriformesFamiliAccipitridaeGenusLophotriorchisSpesiesLophotriorchis kienerii Tipe taksonomiLophotriorchis lbs Elang perut-karat (Lophotriorchis kienerii) adalah satu jenis burung pemangsa dari keluarga Accipitridae, sub-keluarga Accipitrinae dan genus Lophotriorchis. Elang ini dapat dijumpai di beberapa daerah berhutan tropis dari semenajung Asia Sela...

LimbotoKecamatanDanau LimbotoNegara IndonesiaProvinsiGorontaloKabupatenGorontaloPemerintahan • CamatAbdul Azis Pakaya, SST., M.P.HPopulasi • Total51,114 (2.019) jiwaKode Kemendagri75.01.01 Kode BPS7502070 Luas127,92 km²Desa/kelurahan14 kelurahan Limboto adalah sebuah kecamatan di Kabupaten Gorontalo, Gorontalo, Indonesia dari 19 kecamatan yang ada di Kabupaten Gorontalo. Limboto juga merupakan ibu kota kabupaten Gorontalo. Terletak di 0,30 derajat Lintang Utara, ...

 

Beit Ya’akovLingkunganNegara IsraelProvinsiYerusalemKotaYerusalemZona waktuUTC+3 (EAT) • Musim panas (DST)UTC+3 (EAT) Beit Ya’akov adalah sebuah lingkungan di kota suci Yerusalem di Provinsi Yerusalem, tepatnya di sebelah timur Israel.[1] Referensi ^ National Geospatial-Intelligence Agency. GeoNames database entry. (search Diarsipkan 2019-09-08 di Wayback Machine.) Accessed 12 May 2011. lbsLingkungan di YerusalemLingkungan-lingkungan Yerusalem sebelah timur garis ...

 

Detektif ConanGambar sampul manga Detektif Conan volume pertama yang diterbitkan oleh Shogakukan名探偵コナン(Meitantei Konan)GenreMisteri, cerita seru[1] MangaPengarangGosho AoyamaPenerbitShogakukanPenerbit bahasa InggrisNA Viz MediaSG Shogakukan Asia (sebagai Detective Conan)Penerbit bahasa IndonesiaElex Media KomputindoMajalahWeekly Shōnen SundayMajalah bahasa IndonesiaShonen StarDemografiShōnenTerbit19 Januari 1994 – presentVolume104 (Daftar volume) Seri animeSutradaraKen...

« Edinburgh » redirige ici. Pour les autres significations, voir Edinburgh (homonymie). Édimbourg en anglais : Edinburgh en scots : Edinburrie en écossais : Dùn Èideann Héraldique Drapeau Dans le sens des aiguilles d'une montre à partir d'en haut à gauche : Calton Hill, Old College de l'université d'Édimbourg, vieille ville, château d'Édimbourg et Princes Street vue de Calton Hill. Administration Pays Royaume-Uni Nation Écosse Council area Édimbou...

 

Alexandre Pato Pato al Milan nella stagione 2010-2011 Nazionalità  Brasile Altezza 177[1] cm Peso 75[1] kg Calcio Ruolo Attaccante Squadra svincolato Carriera Giovanili 2001-2006 Internacional Squadre di club1 2006-2007 Internacional27 (12)[2]2007-2013 Milan117 (51)2013-2014 Corinthians30 (10)[3]2014-2016→  San Paolo62 (19)[4]2016→  Chelsea2 (1)2016-2017 Villarreal14 (2)2017-2019 Tianjin Tianhai47 (30)2...

 

Historic building of the College of William & Mary in Williamsburg, Virginia, USA BraffertonThe Brafferton, seen from Jamestown RoadGeneral informationTown or cityWilliamsburg, VirginiaEstimated completion1723OwnerCollege of William and Mary Part of a series on theCampus of theCollege of William & Mary Historic Campus (College Yard)Wren BuildingBraffertonPresident's House Old CampusAlumni HouseTucker HallBlow HallEwell HallSunken GardenCrim Dell bridgeHearth: Memorial to the Enslaved ...

Voce principale: Molde Fotballklubb. Molde F.K.Stagione 2014Sport calcio Squadra Molde Allenatore Tor Ole Skullerud Presidente Øystein Neerland Eliteserien1º posto (in Champions League) Coppa di NorvegiaVincitore Europa LeagueTerzo turno di qualificazione Maggiori presenzeCampionato: Elyounoussi (30)Totale: Forren (40) Miglior marcatoreCampionato: Elyounoussi (13)Totale: Chima (17) Maggior numero di spettatori26 582 vs Odd (23 novembre 2014) Minor numero di spettatori112 vs Strin...

 

Shahram AmiriShahram Amiri kembali ke Iran, 2010Lahir(1977-10-08)8 Oktober 1977Kermanshah, IranMeninggal3 Agustus 2016(2016-08-03) (umur 38)Tempat tinggalIsfahan, IranKebangsaanKurdi, IranWarga negaraIranDikenal atasProgram nuklir IranKarier ilmiahBidangFisikaInstitusiOrganisasi Energi Atom Iran Shahram Amiri (8 November 1977 – 3 Agustus 2016) adalah seorang ilmuwan nuklir Iran yang hilang dari Iran pada 2009–2010, dan kemudian dihukum mati oleh Iran pada Agustus 2016....

 

Filipino businessman This article is about the chairman and CEO of Ayala Corporation. For his father and the chairman emeritus of Ayala Corporation, see Jaime Zobel de Ayala. In this Philippine name, the middle name or maternal family name is Miranda and the surname or paternal family name is Zóbel de Ayala. This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages) This article contains c...

American TV series or program The Flintstones' 25th Anniversary CelebrationGenreAnimationLive actionComedyVariety showWritten byTom RueggerJohn K. LudinCharles M. Howell IVDirected byRobert GuenettePresented byTim ConwayHarvey KormanVanna WhiteVoices ofHenry CordenJean Vander PylDaws ButlerComposerHoyt CurtinCountry of originUnited StatesOriginal languageEnglishProductionExecutive producersWilliam HannaJoseph BarberaProducersRobert GuenettePeter WoodRunning time60 minutesProduction companies...

 

† Египтопитек Реконструкция внешнего вида египтопитека Научная классификация Домен:ЭукариотыЦарство:ЖивотныеПодцарство:ЭуметазоиБез ранга:Двусторонне-симметричныеБез ранга:ВторичноротыеТип:ХордовыеПодтип:ПозвоночныеИнфратип:ЧелюстноротыеНадкласс:Четвероно...

 

Category 4 Atlantic hurricane in 1948 Hurricane Six (Dog) Surface weather analysis of the hurricane on September 13Meteorological historyFormedSeptember 4, 1948 (1948-09-04)ExtratropicalSeptember 15, 1948DissipatedSeptember 16, 1948 (1948-09-17)Category 4 major hurricane1-minute sustained (SSHWS/NWS)Highest winds130 mph (215 km/h)Lowest pressure≥940 mbar (hPa); ≥27.76 inHgOverall effectsFatalities8 totalDamage$400,000 (1948 USD)Areas affectedBe...

27-й армійський корпусXXVII. Armeekorps Колона німецьких винищувачів танків «Насхорн» просувається по населеному пункту. Східний фронт. Січень 1944На службі 26 серпня 1939 — 8 травня 1945Країна  Третій РейхВид HeerТип ВермахтРоль піхотаЧисельність армійський корпусУ складі Арм�...

 

Inactive U.S. Air Force major command United States Air Forces Southern CommandUSAF Southern Command emblemActive20 November 1940 – 1 January 1976(35 years, 1 month) Detailed 8 July 1963 – 1 January 1976 (as United States Air Forces Southern Command)31 July 1946 – 8 July 1963 (as Caribbean Air Command)18 September 1942 – 31 July 1946 (as Sixth Air Force)5 August 1941 - 18 September 1942 (as Caribbean Air Force)20 November 1940 – 5 August 1941 (as Panama Canal Air Force) Co...

 

Trotskyist international founded in 1963 This article is about the post-1963 organization. For the pre-1963 history of the movement, see Fourth International. Fourth International AbbreviationFI, USFI, or USecFoundedJuly 1963; 61 years ago (1963-07)Preceded byFourth International (1938)HeadquartersParisNewspaperInternational ViewpointInprecorIdeologyCommunismTrotskyismPolitical positionFar-leftWebsitefourth.international Part of a series onTrotskyism Concepts ...

Artikel atau sebagian dari artikel ini mungkin diterjemahkan dari Ford Model T di en.wikipedia.org. Isinya masih belum akurat, karena bagian yang diterjemahkan masih perlu diperhalus dan disempurnakan. Jika Anda menguasai bahasa aslinya, harap pertimbangkan untuk menelusuri referensinya dan menyempurnakan terjemahan ini. Anda juga dapat ikut bergotong royong pada ProyekWiki Perbaikan Terjemahan. (Pesan ini dapat dihapus jika terjemahan dirasa sudah cukup tepat. Lihat pula: panduan penerjemaha...

 

Literary genre involving autobiographical accounts of enslaved Africans in the Americas The slave narrative is a type of literary genre involving the (written) autobiographical accounts of enslaved persons, particularly Africans enslaved in the Americas, though many other examples exist. Over six thousand such narratives are estimated to exist;[1] about 150 narratives were published as separate books or pamphlets. In the United States during the Great Depression (1930s), more than 2,3...