glibc源代码

时间:2017-07-12 06:14:43

标签: c++ c glibc

我正在阅读glibc的源代码,我发现它有两个具有相同名称的宏 这个是在线路上的 #define L_(Str) L##Str
这就在130号线上 #define L_(Str) Str

这些宏到底意味着什么?用法仅用于比较两个字符
例如,在第494行,您可以看到它用于比较* f和' $'之间的字符值。
if(*f == L_('$'))。如果我们想比较两个字符,我们可以直接比较它们,而不是通过宏指导它们?另外,第105行宏的用例是什么?

2 个答案:

答案 0 :(得分:8)

它假装具有L前缀的宏参数(wchar_t literal - 它使用尽可能大的数据类型来表示每个可能的字符代码点而不是char类型中的正常8位)如果您正在编译wscanf版本的函数(第105行)。否则它只是按原样传递参数(第130行)。

##是c预处理器中的字符串连接运算符,L ##' $'将扩展到L' $'最终

总结:它用于编译vscanf函数的两个互斥版本 - 一个在wchar_t上运行,一个在char上运行。

查看此答案:What exactly is the L prefix in C++?

答案 1 :(得分:2)

让我们读一下代码。 (我不知道它做了什么,但我可以阅读代码)

首先,为什么你指出有两个定义?其中一个在定义COMPILE_WSCANF时使用,另一个在其他情况下使用。什么是COMPILE_WSCANF?如果我们进一步查看文件,我们可以看到定义了不同的函数。定义COMPILE_WSCANF后,我们最终得到的函数(通过各种宏)为vfwscanf,否则我们得到vfscanf。这是一个很好的指示,这个文件可能用于编译两个不同的函数,一个用于普通字符,一个用于宽字符。最有可能的是,构建系统使用不同的定义将文件编译两次。这样做是为了使我们不必两次写同一个文件,因为普通和宽字符函数都非常相似。

我很确定这意味着这个宏与宽字符有关。如果我们看看它是如何使用的,它用于在比较等中包装字符常量。当'x'是普通字符常量时,L'x'是表示相同字符的宽字符常量(wchar_t类型)。

因此宏用于在代码中包装字符常量,这样我们就不必拥有#ifdef COMPILE_WSCANF