Непереносимым хаком будет использование расширения препроцессора __COUNTER__
. Это не стандартная функция C, но должна поддерживаться в последних компиляторах g cc, clang и msv c.
Препроцессор увеличивает значение счетчика после каждой оценки , так что вам нужно форсировать оценку, используя что-то вроде:
// in case __COUNTER__ was previously used in a different header
const static int initial_counter = __COUNTER__;
#ifdef ITEM1
const static int item1_defined = __COUNTER__; // +1
#endif
#ifdef ITEM2
const static int item2_defined = __COUNTER__; // +1
#endif
#ifdef ITEM3
const static int item3_defined = __COUNTER__; // +1
#endif
// must subtract 1 because this line also evaluates __COUNTER__
const static int total_item_count = (__COUNTER__) - initial_counter - 1;
А затем:
items_list_t item_list =
{
.items = { ... },
.num_items = total_item_count
}
Более портативная альтернатива препроцессора - использовать Boost , который должен быть более переносимым (но он написан для C ++, поэтому вам, возможно, придется перенести некоторые детали на C самостоятельно) или использовать генератор кода (рекомендуется).
Включение генератора кода в ваши сценарии сборки будет генерировать реальный исходный код, который вы можете добавить и отладить при необходимости. Хаки препроцессора могут легко выйти из-под контроля.