Что-то в этом вопросе звучит искаженно. То, как вы пишете вызов функции в main, зависит исключительно от ее объявления в a.h. Наличие или отсутствие a.c не меняет этого. Конечно, ничего, связанного с макросами или указателями на функции.
Компиляция и компоновка - это два разных шага; компилятор проверяет, что вы передаете правильное число и типы аргументов и присваиваете результат нужному типу объекта на основе объявления функции, в то время как компоновщик пытается разрешить ссылку на реализацию функции в машинном коде.
Результатом компиляции и компоновки является бинарный шлам, который может иметь или не иметь какой-либо очевидной связи с исходным исходным кодом 1 . Отладочные версии сохраняют различные уровни информации для поддержки отладчиков исходного уровня, но вы можете в значительной степени полагаться на версии выпуска, не сохраняющие любую полезную исходную информацию.
1. Время от времени кто-то просит инструмент для восстановления исходного кода из исполняемого файла; это часто называют попыткой превратить гамбургер в корову.