В целом, лучше всего зарезервировать использование макросов препроцессора для случаев, когда вам нужна способность препроцессора манипулировать кодом до его компиляции - вам не следует использовать макросы препроцессора для определения процедур, которые могут быть реализованыкак нормальные функции.Поскольку препроцессор заменяет код макроса везде, где вызывается макрос, может быть сложно отлаживать возникающие ошибки.Например, если вы вызываете свой макрос FPGA_INIT (), глобальные переменные (предположительно) P0SEL, P0DIR и FPGA_START_CODE могут быть скрыты местными жителями с тем же именем.
Если вы объявите функцию fpga_init (),Компилятор поместит код для этой функции вместе с кодом для других функций, которые вы объявляете, согласно тем правилам, которые он знает для платформы, на которую вы нацелены.Если вы объявите макрос FPGA_INIT (), компилятор никогда не узнает, что он существует, так как все ссылки на него будут разрешены препроцессором;компилятор будет видеть и компилировать операторы макроса отдельно в каждой вызванной им функции.
Если вам не нужно вызывать этот код с большой частотой (во внутреннем цикле), производительность реализации макросов и функций, скорее всего, будетбыть неотличимымЕсли вам нужно часто вызывать код, попробуйте измерить производительность по-разному: в зависимости от архитектуры вашего процессора, может быть быстрее использовать препроцессор для размещения кода внутри строки, или может быть быстрее получить кодв отдельной функции (особенно, если расширение каждого вызова приводит к тому, что важный цикл переполняет строку кэша).