Trato de aportar algo...Nomrmalmente es buen criterio de programacion colocar en un archivo "h" las funciones que un modulo exporta, solo esas, las funciones que son de uso interno solo deberian ser visibles al mismo modulo, estas deberian ser declaradas con static. Todo esto mantiene el concepto de modularidad de los programas. No conozco realmente el C18, pero es muy importante el concepto de prototipos porque hay compiladores que si no encuentran un prototipo asumen que la funcion es del tipo int Function( void ) y si la misma devuelve otra cosa que no sea int ahi se producen los problemas.
Con respecto a tu caso en particular suele suceder a veces que el error de compilacion que te muestra el mismo no tenga nada que ver con la linea donde esta realmente el error, a veces por el parser o a veces simplemente porque el compilador no es muy bueno que digamos, para estos caso sugiero, si es que es posible, listar unicamente la salida del preprocesador, normalmente corrre como aplicacion independiente, y analizando esto podes detectar mejor el error, me pasado con macros bastante complicadas encontrar bugs que de otra manera me resultaron imposibles.
Pero repito no conozco el C18 asi que no se si esto se puedo hacer.
Salu2!