Программно получить смещение памяти членов структуры 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),
/* ... */
};
Тогда у вас может быть функция, которая перебирает таблицу в поисках заданного имени и получает смещение. Вы можете иметь несколько таких таблиц, по одной для каждой структуры, и использовать одну и ту же функцию поиска. Если у вас так много членов, что производительность линейного поиска становится проблемой, вы можете выполнить бинарный поиск или добавить хэш.