2015-11-24 1 views
2

я шел через исходный код лоска и застрял в макроопределения:Что означает ({;}) и ({0;}) в определении макроса?

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

определен в файле lustre/ldlm/ldlm_resource.c.
Что означает определение макроса?

+1

Макросы - это простая замена текста. Этот макрос означает, что фрагмент кода 'ldlm_namespace_proc_register (x)' будет преобразован в '({0;})'. Не больше, не меньше. –

+0

@ M.M Вам нужно сделать ответ. –

+1

@CareyGregory OK, хотя я подозреваю, что это проблема XY, и OP действительно хочет знать, что '({0;})' делает –

ответ

4

Макросы - это замена обычного текста. Этот макрос означает, что фрагмент кода 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); 

, но и то, что в зависимости от ключей компилятора или другой конфигурации, этот код МАИ либо фактически вызывать функцию, либо в случае, когда ваши строки включены, на самом деле ничего не делают.

+0

Спасибо @ M.M, еще один вопрос, так ли это отношение каким-либо образом к возвращаемому значению функции? –

+0

@bhagyeshdudhediya какая функция? –

+0

Возвращаемое значение 'ldlm_namespace_proc_register();' –

1

@bhagyesh: все, что сказал M.M правильно и если вы видите блеск/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 */ 

Так вот эти функции становятся манипулируют в зависимости от Defination от LPROCFS. Думаю, теперь это видно.

А про ваш вопрос ..

Спасибо @ M.M, еще один вопрос, так ли он связан каким-либо образом к возвращаемому значению функции? -

Вот небольшой эксперимент, в котором ясно ...

#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 не определен ..

[[email protected] lustre-wc-rel]# ./test_directives 
In main 
after returning rc=0 

Когда LPROCFS определяется ...

[[email protected] lustre-wc-rel]# ./test_directives 
In main 
In my_register val=2 
In my_unregister val=3 
after returning rc=4 
[[email protected] lustre-wc-rel]# 
+0

Это действительно отличный пример. Спасибо @Ashish Maurya –

 Смежные вопросы

  • Нет связанных вопросов^_^