我目前正在尝试了解glibc启动例程(__libc_start_main)如何处理Elf辅助矢量类型(auxv_t)。
浏览glibc的源代码,我找到了一些名为GLRO的函数的引用。在尝试追踪此函数的定义时,我能找到的最接近的是
#define GLRO(x) _##x
当我搜索“ ## x”时,我发现的是其他类似的“#define”指令,让我感到困惑。这个定义是什么意思? “ ## x”是某种编译器指令吗?
答案 0 :(得分:7)
Kerrek SB的答案提供了它的功能,但不是宏的目的。所以这就是:
“GLRO()宏用于访问全局或本地只读数据,请参阅sysdeps / generic / ldsodefs.h。”
答案 1 :(得分:4)
这是一个预处理器宏。
您可以通过运行预处理器自己查看它的功能。只需制作一个示例文件,如下所示:
// foo.c
#include <some_glibc_header.h>
GLRO(hello)
现在运行预处理器:
gcc -E foo.c
您将看到宏通过在给定令牌前放置下划线来创建新令牌;在我们的示例中,我们获得_hello
。 ##
预处理程序运算符连接标记。
答案 2 :(得分:3)
#define GLRO(x) _##x
##
是标记粘贴运算符,它连接两个操作数。
a ## b
会产生ab
,_ ## x
会产生_x
。
例如:
GLRO(my_symbol) = 0;
会导致:
_my_symbol = 0;