什么是桩代码(Stub)?

摘一段使用“桩代码”的场景,来自《程序员的自我修养》第一版第264页: 当延迟载入的API第一次被调用时,由链接器添加的特殊的桩代码就会启动,这个桩代…
关注者
356
被浏览
254,742
登录后你可以
不限量看优质回答私信答主深度交流精彩内容一键收藏

stub code是占坑的代码,桩代码给出的实现是临时性的/待编辑的。
它使得程序在结构上能够符合标准,又能够使程序员可以暂时不编辑这段代码。

我的一位同事需要编写一个程序,要求在某一地点存储每个文件的文件名和相关信息。数据存储于一个结构表中,他决定使用散列表。这里就需要用到可调试性编码。他并不想一步登天,一次完成所有的任务。他首先让最简单的情况能够运行,就是散列函数总是返回一个0,,这个散列函数如下:
int hash_filename(char *s)
{
return 0;
}

这个函数的效果就是一个散列表还未被使用。所有的元素都存储在第零个位置后面的链表中,这使得程序很容易调试,因为无需计算散列函数的具体值。

——《C专家编程》p186-187
这个hash_filename函数就是一段桩代码。而作者的同事可以放心地完成程序的剩余部分,而无需担心散列表。在最后,他可以再激活这个散列表。

另外在glibc-2.18中,/bits/libc-lock.h这个头文件中,第一行的注释是这样的:

/* libc-internal interface for mutex locks. Stub version.

而这个文件的内容是一些宏的定义,这些宏的定义都是空的:

#define __libc_lock_define(CLASS,NAME)
#define __libc_lock_define_recursive(CLASS,NAME)
#define __rtld_lock_define_recursive(CLASS,NAME)
#define __libc_rwlock_define(CLASS,NAME)

而在非stub version的头文件中,这些宏的定义是有实质性的内容的。