簡體   English   中英

glibc源代碼中的L_宏

[英]L_ macro in glibc source code

我正在閱讀glibc的源代碼,我發現它有兩個具有相同名稱的宏
這個是在105行
#define L_(Str) L##Str
這就在130號線上
#define L_(Str) Str

這些宏到底意味着什么? 用法僅用於比較兩個字符
例如,在第494行,您可以看到它用於比較* f和'$'之間的字符值
if(*f == L_('$')) 如果我們想比較兩個字符,我們可以直接比較它們,而不是通過宏指導它們? 另外,第105行宏的用例是什么?

它假設具有L前綴的宏參數(wchar_t literal - 它使用表示每個可能的字符代碼點而不是char類型中的正常8位所需的大數據類型)如果您正在編譯函數的wscanf版本(第105行)。 否則它只是按原樣傳遞參數(第130行)。

##是c預處理器中的字符串連接運算符,L ##'$'最終將擴展為L'$'。

總結一下:它用於編譯vscanf函數的兩個互斥版本 - 一個在wchar_t上運行,一個在char上運行。

看看這個答案: C ++中的L前綴究竟是什么?

我們來看看代碼。 (我不知道它做了什么,但我可以閱讀代碼)

首先,為什么你指出有兩個定義? 其中一個在定義COMPILE_WSCANF時使用, COMPILE_WSCANF在其他情況下使用。 什么是COMPILE_WSCANF 如果我們進一步查看文件,我們可以看到定義了不同的函數。 當定義COMPILE_WSCANF ,我們最終得到的函數(通過各種宏)是vfwscanf否則我們得到vfscanf 這是一個很好的指示,這個文件可能用於編譯兩個不同的函數,一個用於普通字符,一個用於寬字符。 最有可能的是,構建系統使用不同的定義將文件編譯兩次。 這樣做是為了使我們不必兩次寫同一個文件,因為普通和寬字符函數都非常相似。

我很確定這意味着這個宏與寬字符有關。 如果我們看看它是如何使用的,它用於在比較等中包裝字符常量。 'x'是正常字符常量時, L'x'是表示相同字符的寬字符常量( wchar_t類型)。

所以宏用於在代碼中包裝字符常量,這樣我們就不必擁有#ifdef COMPILE_WSCANF

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM