一位同事让我在memcached中解释一些C代码。我正在承认我也不理解它。
它与类似C函数的宏定义有关,参数也没有替换列表。例如,从memcached.c中的第2751行开始:
if (return_cas)
{
MEMCACHED_COMMAND_GET(c->sfd, ITEM_key(it), it->nkey,
it->nbytes, ITEM_get_cas(it));
/* Goofy mid-flight realloc. */
if (i >= c->suffixsize) {
char **new_suffix_list = realloc(c->suffixlist,
sizeof(char *) * c->suffixsize * 2);
if (new_suffix_list) {
c->suffixsize *= 2;
c->suffixlist = new_suffix_list;
MEMCACHED_COMMAND_GET()在trace.h中的第23行定义:
#define MEMCACHED_COMMAND_GET(arg0, arg1, arg2, arg3, arg4)
带有参数的C类宏函数定义,确定。没有替换名单。
memcached.c上的cpp输出显示类似函数的宏变为';':
# 2751 "memcached.c"
if (return_cas)
{
;
if (i >= c->suffixsize) {
char **new_suffix_list = realloc(c->suffixlist,
sizeof(char *) * c->suffixsize * 2);
if (new_suffix_list) {
c->suffixsize *= 2;
c->suffixlist = new_suffix_list;
有没有人能够深入了解程序员为什么会包含类似函数的宏而没有像MEMCACHED_COMMAND_GET()这样的替换列表对生成的代码没有影响?这样做有什么目的?提前谢谢你。
答案 0 :(得分:2)
在Solaris和Mac OSX上,它被替换为触发DTrace探针,因此它会扩展为其他内容。
答案 1 :(得分:1)
这可能与可移植性问题有关:例如,一段代码与BSD相关,但在Linux上则不然。反之亦然。
我不知道这里的具体情况,但这可能是一个原因。