Я получил глобальный массив, и мой код является модульным.
Хотя эти два утверждения не полностью противоречат друг другу, они не подходят друг другу.Избегайте глобальных данных.
Каждый модуль должен иметь возможность добавлять какой-либо обработчик в глобальный массив.
Ваши модули могут делать это во время выполнения с помощью некоторой инициализациифункции, но им нужна помощь, если они должны сделать это во время компиляции через инициализатор массива.Определение массива будет скомпилировано только один раз, и единице перевода, в которой он появляется, необходимо знать размер массива и все его начальные значения.Различные единицы перевода компилируются независимо.
Поэтому я искал и пытался реализовать что-то вроде:
ADD_ITEM(0,0);
Идея состоит в том, что макрос ADD_ITEM должен просто расширяться до {0,0} и к этому следует добавить объектно-подобный макрос ITEMS.
Существуют всевозможные забавные игры, в которые вы можете играть с препроцессором, но это не одна из них.Помимо независимой компиляции, расширение макроса не может изменить определение другого макроса.Один макрос может использовать другой, но это совсем другое.
Если вы настаиваете на использовании глобального массива для ваших данных, то его размер и начальное содержимое определяются во время компиляции.Если вы хотите настроить те, в зависимости от того, какие модули включены, то вам нужно какое-то генерирование кода, чтобы позаботиться об этом, или, по крайней мере, запустить его.