X macro - генерация повторяющегося кода

  1. #include <Python.h>
  2.  
  3. #define STRUCTS \
  4.     X(foo)      \
  5.     X(bar)      \
  6.     X(buzz)     \
  7.  
  8. #define X(name)                                                 \
  9. static PyObject *name ## __size(PyObject *self, PyObject *args) \
  10. {                                                               \
  11.     return PyInt_FromSize_t(sizeof(struct name));               \
  12. }
  13. STRUCTS
  14. #undef X
  15.  
  16. static PyMethodDef methods[] = {
  17. #define X(name) { #name "__size", name ## __size, METH_VARARGS, NULL },
  18. STRUCTS
  19. #undef X
  20.     {NULL, NULL, 0, NULL}
  21. };
Эта техника позволяет генерировать повторяющийся код. Сперва объявляются данные, для которых нужно сгенерировать похожий код. В данном случае это список структур. Далее через "#define X" объявляется код, который надо для данных сгенерировать. В первом определении X генерируется функция, возвращающая размер определённой структуры. А второе определение X используется, чтобы зарегистрировать эти функции, как методы Python-модуля.

Реклама

Мы в соцсетях

tw tg yt gt