带有参数列表但没有替换列表的 c 类似函数的宏?

标签 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() 这样对生成的代码没有影响的替换列表?这样做的目的是什么?预先感谢您。

最佳答案

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

关于带有参数列表但没有替换列表的 c 类似函数的宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9315116/

相关文章:

c - 如何比较 "if"语句中的字符串?

emacs - 如何在我的 Emacs 初始化文件中生成键盘宏?

c - 使用单个语句在 C 中启动后台线程

php - laravel 之外的 Laravel 缓存

c - SSE operator+= 用于 vector

c - 如何将 __m128d simd vector 的内容存储为 double 而不将其作为 union 访问?

php - 构建 PHP 扩展并使用 call_user_function

C++ 宏和 std::stringstream

redis - Memcached 和 Redis 类型是 NoSQL 数据库吗?

.net - 无法访问Docker中的Couchbase Memcached存储桶