宏定义中的 ({;}) 和 ({0;}) 是什么意思?
What does ({;}) and ({0;}) in a macro definition signify?
我正在查看 lustre 源代码并卡在宏定义处:
#define ldlm_namespace_proc_unregister(ns) ({;})
#define ldlm_namespace_proc_register(ns) ({0;})
定义在文件lustre/ldlm/ldlm_resource.c
.
这个宏定义是什么意思?
宏是纯文本的替代品。这个宏的意思是将一段代码ldlm_namespace_proc_register(x)
转化为({0;})
。不多也不少。
如果您还想知道代码 ({;})
和 ({0;})
的含义,那么这些是 GCC expression statements。
根据该文档,({0;})
应该与 0
完全相同,而 ({;})
是类型 void
.
的表达式
推测如下:这些宏的目的可能是支持库的用户编写如下代码:
int result = ldlm_namespace_proc_register(x);
// ...
ldlm_namespace_proc_unregister(x);
但也取决于编译器开关或其他配置,此代码可能实际上调用了一个函数,或者在您的行已启用的情况下,实际上什么都不做。
@bhagyesh:M.M 所说的都是正确的,如果你看到 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 的定义对这些函数进行操作。我认为它现在是可见的。
关于你的问题..
Thanks @M.M, one more question, so does it relate in any way to the return value of the function? –
Here is small experiment in which it is clear...
#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]#
我正在查看 lustre 源代码并卡在宏定义处:
#define ldlm_namespace_proc_unregister(ns) ({;})
#define ldlm_namespace_proc_register(ns) ({0;})
定义在文件lustre/ldlm/ldlm_resource.c
.
这个宏定义是什么意思?
宏是纯文本的替代品。这个宏的意思是将一段代码ldlm_namespace_proc_register(x)
转化为({0;})
。不多也不少。
如果您还想知道代码 ({;})
和 ({0;})
的含义,那么这些是 GCC expression statements。
根据该文档,({0;})
应该与 0
完全相同,而 ({;})
是类型 void
.
推测如下:这些宏的目的可能是支持库的用户编写如下代码:
int result = ldlm_namespace_proc_register(x);
// ...
ldlm_namespace_proc_unregister(x);
但也取决于编译器开关或其他配置,此代码可能实际上调用了一个函数,或者在您的行已启用的情况下,实际上什么都不做。
@bhagyesh:M.M 所说的都是正确的,如果你看到 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 的定义对这些函数进行操作。我认为它现在是可见的。
关于你的问题..
Thanks @M.M, one more question, so does it relate in any way to the return value of the function? –
Here is small experiment in which it is clear...
#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]#