C++ glibc源代码中的L_uu宏

C++ glibc源代码中的L_uu宏,c++,c,glibc,C++,C,Glibc,我仔细阅读了的源代码,发现它有两个同名的宏 这个在第105行 #定义L#(Str)L##Str 这在第130行 #定义L#Str(Str)Str 这些宏的真正含义是什么?此用法仅用于比较两个字符 例如,在第494行,您可以看到它用于比较*f和“$”之间的字符值 如果(*f==L_uz(“$”)。如果我们想比较这两个字符,我们可以直接比较它们,而不是通过宏来引导它们?另外,第105行的宏的用例是什么?如果您正在编译wscanf版本的函数(第105行),它会在宏参数前面加上L前缀(wchar\t l

我仔细阅读了的源代码,发现它有两个同名的宏
这个在第105行
#定义L#(Str)L##Str

这在第130行
#定义L#Str(Str)Str

这些宏的真正含义是什么?此用法仅用于比较两个字符
例如,在第494行,您可以看到它用于比较*f和“$”之间的字符值

如果(*f==L_uz(“$”)
。如果我们想比较这两个字符,我们可以直接比较它们,而不是通过宏来引导它们?另外,第105行的宏的用例是什么?

如果您正在编译wscanf版本的函数(第105行),它会在宏参数前面加上L前缀(wchar\t literal-它使用所需的大数据类型来表示每个可能的字符代码点,而不是字符类型中的正常8位)。否则它只是按原样传递参数(第130行)

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

总而言之:它用于编译vscanf函数的两个互斥版本——一个在wchar_t上运行,一个在char上运行

查看以下答案:

让我们阅读代码。(我不知道它做什么,但我能读懂代码)

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

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


因此,宏用于在代码中包装字符常量,这样我们就不必使用
#ifdef COMPILE\u WSCANF

如果仔细观察,您会发现这两个宏定义使用条件编译是互斥的。您还应该花一些时间阅读有关宽字符和宽字符串的内容。比较与宏有什么关系?请显示您引用的完整行。在支持Unicode的32位(或更大)系统上,
wchar\u t
通常是32位表示Unicode码点。值得注意的例外是Windows,其中
wchar\u t
是表示UTF-16编码字符的16位类型。否则,
wchar\u t
只需“足够大以表示任何受支持的字符代码点”(引用自)。感谢您的帮助@有个程序员,谢谢,我不知道。我改变了答案。谢谢你的帮助!!