2

我正在浏览 luster 源代码并停留在宏定义中:

#define ldlm_namespace_proc_unregister(ns)      ({;})  
#define ldlm_namespace_proc_register(ns)        ({0;})

在文件中定义lustre/ldlm/ldlm_resource.c
这个宏定义意味着什么?

4

2 回答 2

4

宏是纯文本替换。这个宏意味着一段代码ldlm_namespace_proc_register(x)将被转换为({0;}). 不多也不少。

如果您还想知道代码的含义,({;})那么({0;})这些是GCC 表达式语句

根据该文档,({0;})应该与 , 完全相同0,并且({;})是 type 的表达式void


推测如下:这些宏的目的可能是支持库的用户编写如下代码:

int result = ldlm_namespace_proc_register(x);
// ...
ldlm_namespace_proc_unregister(x);

而且取决于编译器开关或其他配置,此代码可能实际上调用一个函数,或者在启用您的行的情况下,实际上什么都不做。

于 2015-11-24T04:55:20.883 回答
1

@bhagyesh:无论 MM 说什么都是正确的,如果你看到 lustre/ldlm/ldlm_resource.c,在第 74 行你有

74 #ifdef LPROCFS
   .......
   .......
 385 #undef MAX_STRING_SIZE
 386 #else /* LPROCFS */
 387
 388 #define ldlm_namespace_proc_unregister(ns)      ({;})
 389 #define ldlm_namespace_proc_register(ns)        ({0;})
 390

 391 #endif /* LPROCFS */

所以这里这些函数被操纵取决于 LPROCFS 的定义。我认为它现在是可见的。

关于你的问题..

谢谢@MM,还有一个问题,那么它与函数的返回值有什么关系吗?——</p>

这是一个小实验,其中很明显......

#include<stdio.h>

#ifdef LPROCFS
int my_register(int x)
{
        int y = x*x;
        printf("In my_register val=%d\n", x);
        return y;
}

void my_unregister(int x)
{
        printf("In my_unregister val=%d\n", x);
}

#else

#define my_register(x) ({0;})
#define my_unregister(x) ({;})

#endif

int main ()
{
        printf("In main\n");
        int rc = my_register(2);
        my_unregister(3);
        printf("after returning rc=%d\n", rc);
        return 0;
}

当 LPROCFS 未定义时..

[root@ashish-203 lustre-wc-rel]# ./test_directives
In main
after returning rc=0

当 LPROCFS 被定义...

[root@ashish-203 lustre-wc-rel]# ./test_directives
In main
In my_register val=2
In my_unregister val=3
after returning rc=4
[root@ashish-203 lustre-wc-rel]#
于 2016-06-05T07:53:38.883 回答