【发布时间】:2012-02-16 16:32:06
【问题描述】:
一位同事让我在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() 这样对生成的代码没有影响的替换列表?这样做的目的是什么?提前谢谢您。
【问题讨论】:
-
你可能想看看这个问题:stackoverflow.com/questions/5501990/…
-
@Jason 太好了,谢谢。这就说得通了。我从没想过搜索 MEMCACHED_COMMAND_GET 本身,只搜索包含“类似函数的宏”的术语。感谢您为我指明正确的方向。
标签: c macros memcached c-preprocessor