Страж Python в расширении C++

Я работаю над модулем расширения Python, написанным на C++.

Согласно документации Python таблица методов модуля должна быть записана так:

static PyMethodDef SpamMethods[] = {
    ...
    {"system",  spam_system, METH_VARARGS,
    "Execute a shell command."},
    ...
    {NULL, NULL, 0, NULL}        /* Sentinel */
};

Но я вижу, что некоторые разработчики пишут часового так:

static PyMethodDef SpamMethods[] = {
    ...
    {"system",  spam_system, METH_VARARGS,
    "Execute a shell command."},
    ...
    {}                          /* Sentinel */
};

Мой вопрос заключается в следующем: есть ли риск использовать сокращенную версию?

1 ответ

Решение

Класс pod, инициализированный с {} имеет поля, не установленные в явном виде в ноль.

Если PyMethodDef это стручок (простые старые данные), как я подозреваю, {NULL, NULL, 0, NULL} будет генерировать те же данные, что и {},

Это верно как для C, так и для C++.

Если класс PyMethodDef был не-под класс в C++11, {NULL, NULL, 0, NULL} может сделать что-то другое, чем {}, но я сильно сомневаюсь, что это так здесь.

Единственное, что меня беспокоит, так это если библиотека поменяется на меня, чтобы сделать PyMethodDef не стручок, и решил сделать {} не обнуляйте данные одновременно. Я считаю это маловероятным.

Другие вопросы по тегам