c-宏定义中的({;})和({0;})表示什么

  • 本文关键字:表示 宏定义 c macros lustre
  • 更新时间 :
  • 英文 :


我正在浏览光泽源代码,并被困在宏定义:

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

定义在文件CCD_ 1中
这个宏定义意味着什么?

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

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

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


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

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

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

@bhagyesh:无论M.M说什么都是正确的,如果你看到光泽/ldm/ldm_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的定义进行操作。我想它现在是可见的。

关于你的问题。。

谢谢@M.M,还有一个问题,它与函数的返回值有任何关系吗

这是一个很清楚的小实验。。。

#include<stdio.h>
#ifdef LPROCFS
int my_register(int x)
{
        int y = x*x;
        printf("In my_register val=%dn", x);
        return y;
}
void my_unregister(int x)
{
        printf("In my_unregister val=%dn", x);
}
#else
#define my_register(x) ({0;})
#define my_unregister(x) ({;})
#endif
int main ()
{
        printf("In mainn");
        int rc = my_register(2);
        my_unregister(3);
        printf("after returning rc=%dn", 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]#

相关内容

  • 没有找到相关文章

最新更新