【问题标题】:c function-like macro with argument list but without replacement list?带有参数列表但没有替换列表的c函数式宏?
【发布时间】: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


【解决方案1】:

在 Solaris 和 Mac OSX 上,它被替换为触发 DTrace 探测,因此它可以扩展到其他东西。

【讨论】:

  • 只有在定义了 ENABLE_DTRACE 时,才可能从 memcached_dtrace.d 创建具有这些扩展的 memcached_dtrace.h。聪明,聪明。我的 Ubuntu 系统上缺少 memcached_dtrace.h 文件让我上当了。谢谢!
【解决方案2】:

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

我无法说出这里的具体情况,但这可能是一个原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 2020-07-13
    相关资源
    最近更新 更多