Я хотел бы инициализировать массив структур с одним и тем же элементом, то есть
struct st ar[] = { {1,2}, {1,2}, {1,2} };
Однако я НЕ хочу запускать какой-либо код для этого, я хотел бы, чтобы расположение памяти при выполнении программы было таким, без каких-либо инструкций процессора (это увеличило бы время загрузки на очень медленном процессоре и относительно больших массивах). ).
Это имеет смысл, когда массив используется в качестве мини-базы данных ad-hoc (сопоставляет id со структурой) и когда требуется использовать значение по умолчанию для всех значений базы данных.
Моим лучшим решением было использовать что-то вроде
#define I {1,2}
struct st ar[SIZE_OF_ARRAY] = { I,I,I };
Так что компилятор предупредит меня, если у меня слишком много или слишком мало I
с. Но это далеко от идеала.
Я думаю, что в ANSI-C для этого нет решения, но я подумал, что, возможно, есть макрос, или расширение gcc, которое сделает эту работу. В идеале мне бы хотелось стандартное решение, но даже конкретных компиляторов было бы достаточно.
Я думал, что каким-то образом смогу определить макрос рекурсивно, чтобы I(27)
было разрешено до 27 {1,2}
с, но я не думаю, что это возможно. Но, может быть, я ошибаюсь, есть ли взломать для этого?
Может, встроенная сборка сработает? Было бы очень легко определить такой макет памяти с помощью MASM или TASM, но я не уверен, что можно встроить инструкции макета памяти в код C.
Есть ли какой-нибудь трюк с компоновщиком, который соблазнил бы его для инициализации памяти в соответствии с моими приказами?
PS
Я знаю Я могу автоматически генерировать C-файл с помощью некоторого сценария. Использование пользовательских сценариев нежелательно. Если бы я использовал собственный скрипт, я бы изобрел C-макрос REP(count,exp,sep)
и написал бы мини-C-препроцессор, чтобы заменить его на exp sep exp sep ... exp {exp appears count time}
.