Там какой-либо путь состоит в том, чтобы циклично выполниться через структуру с элементами различных типов в C?

F5 для выполнения текущего запроса является легкой победой, после этого, универсальный редактор Миссисипи команды CTRL + K + C , чтобы прокомментировать выделенный текст и затем CTRL + K + U , чтобы не прокомментировать.

20
задан Cœur 1 March 2017 в 15:30
поделиться

4 ответа

Я не уверен, чего вы хотите достичь, но вы можете использовать X-Macros и заставить препроцессор выполнять итерацию по всем полям структуры:

//--- first describe the structure, the fields, their types and how to print them
#define X_FIELDS \
    X(int, field1, "%d") \
    X(int, field2, "%d") \
    X(char, field3, "%c") \
    X(char *, field4, "%s")

//--- define the structure, the X macro will be expanded once per field
typedef struct {
#define X(type, name, format) type name;
    X_FIELDS
#undef X
} mystruct;

void iterate(mystruct *aStruct)
{
//--- "iterate" over all the fields of the structure
#define X(type, name, format) \
         printf("mystruct.%s is "format"\n", #name, aStruct->name);
X_FIELDS
#undef X
}

//--- demonstrate
int main(int ac, char**av)
{
    mystruct a = { 0, 1, 'a', "hello"};
    iterate(&a);
    return 0;
}

Будет напечатано:

mystruct.field1 is 0
mystruct.field2 is 1
mystruct.field3 is a
mystruct.field4 is hello

Вы также можете добавить имя функции, которая будет вызываться в X_FIELDS ...

42
ответ дан 29 November 2019 в 23:17
поделиться

Не существует безопасного способа перечисления членов структуры, если не известно точное содержимое структуры, и даже в этом случае вы должны быть осторожны с такими вещами, как выравнивание / заполнение структуры.

В зависимости от вашей проблемы может быть безопаснее иметь массив вашей структуры.

4
ответ дан 29 November 2019 в 23:17
поделиться

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

Если это так, ваш выбор будет зависеть от размеров элементов. Если они все одинаковы, вы можете получить указатель на структуру, привести его к одному из ваших типов и увеличивать его до тех пор, пока вы не «израсходуете» всю структуру.

PS: Действительно, не очень безопасная практика . Эта ситуация решается намного лучше с помощью объектно-ориентированного подхода, использующего преимущества полиморфизма. В противном случае нет никаких гарантий относительно выравнивания, как упоминалось ранее.

2
ответ дан 29 November 2019 в 23:17
поделиться

There's no way to iterate through struct members in C language, regardless of whether the have the same size/type or different sizes/types.

2
ответ дан 29 November 2019 в 23:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: