F5 для выполнения текущего запроса является легкой победой, после этого, универсальный редактор Миссисипи команды CTRL + K + C , чтобы прокомментировать выделенный текст и затем CTRL + K + U , чтобы не прокомментировать.
Я не уверен, чего вы хотите достичь, но вы можете использовать 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 ...
Не существует безопасного способа перечисления членов структуры, если не известно точное содержимое структуры, и даже в этом случае вы должны быть осторожны с такими вещами, как выравнивание / заполнение структуры.
В зависимости от вашей проблемы может быть безопаснее иметь массив вашей структуры.
Поскольку вы планируете обрабатывать их в цикле, я предполагаю, что разные типы могут, по крайней мере, обрабатываться одинаково или иметь одинаковые размеры.
Если это так, ваш выбор будет зависеть от размеров элементов. Если они все одинаковы, вы можете получить указатель на структуру, привести его к одному из ваших типов и увеличивать его до тех пор, пока вы не «израсходуете» всю структуру.
PS: Действительно, не очень безопасная практика . Эта ситуация решается намного лучше с помощью объектно-ориентированного подхода, использующего преимущества полиморфизма. В противном случае нет никаких гарантий относительно выравнивания, как упоминалось ранее.
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.