Программно получить смещение памяти членов структуры C без жестко кодируемых имен членов

У меня есть небольшая программа, которую я использую для печати смещения членов структуры, используя offsetof() оператор.

Я использую эту программу во многих контекстах, где рассматриваемые структуры различны, и поэтому мне нужно перепрограммировать код для каждого проекта (и для каждой модификации, которую я делаю в структуре). Поскольку эти структуры имеют тенденцию быть довольно большими (структуры управления и состояния), обновление занимает много времени.

Я хотел бы иметь метод, в котором я могу использовать offsetof() эквивалентно, но где 2-й параметр будет именем члена, заданным в виде строки, вместо жесткого кодирования его в выражении.

Для упрощения предположим, что структуры состоят из одно- и массивов 32-битных слов, поэтому смещение всегда кратно 4.

Кроме того, вместо именных строк приветствуется альтернативный метод.

[ Обратите внимание, что, хотя все члены имеют размер слова, вычисление адреса путем подсчета членов не является хорошим решением, так как компилятор может добавить заполнение между членами. Как было предложено в одном ответе (который был удален), использование упакованного атрибута может решить проблему путем удаления заполнителей, это недопустимое решение, поскольку фактическое приложение, которое определяет структуру, может использовать заполнение для оптимизации доступа к памяти ]

1 ответ

Вы создаете массивы "таблицы символов" вида:

#define S struct mystruct
#define X(m) { #m, offsetof(S, m) }
static const struct table {
    const char *name;
    size_t offset;
} table[] = {
    X(member1),
    X(member2),
    /* ... */
};

Тогда у вас может быть функция, которая перебирает таблицу в поисках заданного имени и получает смещение. Вы можете иметь несколько таких таблиц, по одной для каждой структуры, и использовать одну и ту же функцию поиска. Если у вас так много членов, что производительность линейного поиска становится проблемой, вы можете выполнить бинарный поиск или добавить хэш.

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