X macro - генерация повторяющегося кода
- #include <Python.h>
- #define STRUCTS \
- X(foo) \
- X(bar) \
- X(buzz) \
- #define X(name) \
- static PyObject *name ## __size(PyObject *self, PyObject *args) \
- { \
- return PyInt_FromSize_t(sizeof(struct name)); \
- }
- STRUCTS
- #undef X
- static PyMethodDef methods[] = {
- #define X(name) { #name "__size", name ## __size, METH_VARARGS, NULL },
- STRUCTS
- #undef X
- {NULL, NULL, 0, NULL}
- };
Эта техника позволяет генерировать повторяющийся код. Сперва объявляются данные, для которых нужно сгенерировать похожий код. В данном случае это список структур. Далее через "#define X" объявляется код, который надо для данных сгенерировать. В первом определении X генерируется функция, возвращающая размер определённой структуры. А второе определение X используется, чтобы зарегистрировать эти функции, как методы Python-модуля.