Disculpa pero no uso c18, creo que dejo de existir hace bastante ya (2014)
De todas formas tu codigo no le encuentro sentido. Segun ANSI C deberias tener un entero dentro de los [], el unico caso que encuentro es cuando vos definis el array y dejas que el compilador reserve el espacio de memoria.
Ej...
char buffer_1234[] = "Hola";
El compilador directamente crea buffer_1234, con 5 lugares (ya que incluye el carracter nulo del string \0 )
Luego obviamente si queres podes acceder a donde quieras... Por mas que tenga 5 lugares podes hacer
buffer_1234[20]
Y esto te va a devolver lo que posee la posicion de memoria base + esos 20 char de lugar es decir -> *(buffer_1234 + 20)
Pero esto se consideraria un index overflow del array. Que es algo que deberias evitar. Entonces vamos a tu codigo:
char buffer_1234[]; Esto crea un array¿? que tamaño? cri cri, rara una declaracion donde no hay nada
void main(void) {
buffer_1234[3700]; //Esto accede a la posicion base + 3700 caracteres mas, y devuelve el valor... No define que tiene 3700 elementos
while(1);
}
La sintaxis correcta seria
char buffer_1234[3700];
void main(void) {
while(1);
}
Edit:
Revisando un poco C99
An array type of unknown size is an incomplete type. It is completed, for an identifier of that type, by specifying the size in a later declaration (with internal or external linkage).
A structure or union type of unknown content (as described in 6.7.2.3) is an incomplete type. It is completed, for all declarations of that type, by declaring the same structure or union tag with its defining content later in the same scope.
Basicamente lo que hiciste arriba es un identificador, pero que luego lo tenes que definir dentro del codigo... El problema que no indica donde ubicarlo, sino proveer un acceso a la declaracion sea donde se ubique.. Considero mas util para cuando tenes otros archivos.