6

我目前正在尝试了解 glibc 启动例程(__libc_start_main)如何处理 Elf 辅助向量类型(auxv_t)。

浏览 glibc 的源代码,我发现对一些名为 GLRO 的函数的引用。在试图追踪这个函数的定义时,我能找到的最接近的是

#define GLRO(x) _##x

当我搜索“ ##x”时,我发现的只是其他类似的“#define”指令,这让我感到困惑。这个定义是什么意思?“ ##x”是某种编译器指令吗?

4

3 回答 3

8

Kerrek SB 的答案提供了它的作用,但没有提供宏的用途。所以这里是:

“GLRO() 宏用于访问全局或本地只读数据,请参阅 sysdeps/generic/ldsodefs.h。”

来源:http ://cygwin.com/ml/libc-help/2012-03/msg00006.html

于 2013-11-02T02:58:24.297 回答
5

这是一个预处理器宏。

您可以通过运行预处理器亲自了解它的作用。只需制作一个示例文件,如下所示:

// foo.c
#include <some_glibc_header.h>

GLRO(hello)

现在运行预处理器:

gcc -E foo.c

您将看到宏通过在给定标记前添加下划线来创建新标记;在我们的示例中,我们获得_hello. 预##处理器运算符连接标记。

于 2013-10-08T22:44:31.200 回答
3
#define GLRO(x) _##x

##是令牌粘贴运算符,它连接两个操作数。

例如,a ## b产量ab_ ## x产量_x

例如:

GLRO(my_symbol) = 0;

会导致:

_my_symbol = 0;
于 2013-10-08T22:45:22.283 回答