Я успешно создал макрос на ассемблере, который я использую для создания 32 независимых подпрограмм в исходном файле сборки.Процедуры следуют за целевой системой ABI.Их экспортированные имена символов практически идентичны, за исключением суффикса конечного числа.Вот извлечение символа из собранного объектного файла (многоточие, указывающее непрерывный шаблон).
$ nm default_handler.o | sort
...
00000058 T exception_default_handler_5
0000005f T exception_default_handler_6
00000066 T exception_default_handler_7
0000006d T exception_default_handler_8
00000072 T exception_default_handler_9
00000079 T exception_default_handler_10
0000007e T exception_default_handler_11
00000083 T exception_default_handler_12
00000088 T exception_default_handler_13
...
У меня также есть программа на C, в которой мне нужно ссылаться на каждую из этих отдельных подпрограмм.В некоторых частях программы на C мне нужно ссылаться на все процедуры сборки одновременно, чтобы хранить указатель каждого из них в массиве.Вот необходимый код, необходимый для понимания моей проблемы (с многоточием для обозначения продолжающегося паттерна).Этот код выполняет задачу, указанную выше.
{
...
extern void exception_default_handler_5(void);
extern void exception_default_handler_6(void);
extern void exception_default_handler_7(void);
...
...
array[5] = exception_default_handler_5;
array[6] = exception_default_handler_6;
array[7] = exception_default_handler_7;
...
}
С 64 строками этого подхода;золотое правило кодирования , всегда пишущее читаемый и поддерживаемый код, очевидно, было нарушено.То, что я хотел бы, это способ автоматизировать этот процесс создания внешнего предварительного объявления и помещения его экземпляра в массив, чтобы минимизировать ошибки, которые могут произойти при дублировании кода.
Я думаючто, возможно, это работа для C-макросов, но я не могу придумать, как сделать это с ними.
Есть мысли?