一位同事让我解释一下 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/