Если инициализировать поля в порядке объявления, то будет нечитаемо, легко ошибиться и нельзя пропускать поля.
Если с помощью конструктора, то ему все равно надо передавать параметры, а они безымянные. К тому же это динамика.
Может есть еще способы?
designated initializers (не знаю, как по-русски) - это
struct A {
int a, b, c;
} a = { .a = 1, .c = 2 }; /* a.b == 0 */