c函数式宏与参数列表但没有替换列表?

时间:2012-02-16 16:32:06

标签: c macros memcached c-preprocessor

一位同事让我在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()这样的替换列表对生成的代码没有影响?这样做有什么目的?提前谢谢你。

2 个答案:

答案 0 :(得分:2)

在Solaris和Mac OSX上,它被替换为触发DTrace探针,因此它会扩展为其他内容。

答案 1 :(得分:1)

这可能与可移植性问题有关:例如,一段代码与BSD相关,但在Linux上则不然。反之亦然。

我不知道这里的具体情况,但这可能是一个原因。