identificador esperado o '(' antes de la constante numérica?

Tengo este archivo de encabezado... por alguna razón, sigo recibiendo un error que dice log_server.h:48: error: expected identifier or ‘(’ before numeric constant Recibo este error en ambas líneas que definen las funciones put_evt y print_evt_list, así es como se ve el código:

#ifndef _GENERIC
#define _GENERIC
#include <string.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#endif

#ifndef _NETWORKING
#define _NETWORKING
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/socket.h>
#include <sys/types.h>
typedef struct sockaddr SA;/* To make casting in the (bind, recvfrom, sendto) more readable */
#endif

#define LOGIN_EVT 0
#define LOGOUT_EVT 1

#define RECV_MSG 27
#define SEND_MSG 64000
#define MAX_EVT_COUNT 3000

struct evt{ 
    char user_name[8];
    int type;
    long int time;
};



/* open log file to append the events to its end
 * return 0 on success and -1 on failure (file could not be opened)
 */
int init_log(const char *log_fname);

/* closes the log file
 * return 0 on success and -1 on failure (file could not be opened)
 */
int terminate_log();

/* add new event to the log file
 * return 0 on success and -1 on failure
 */
int put_evt(struct evt *e);

/* get list of events that occured after the given time
 * count is the size of the allocated and passed e-list
 * return number of found events on success and -1 on failure
 */
int get_events(struct evt  *e_list, long int time);

/* print given event's info (name, time)*/
void print_evt(struct evt  *e);

/* print "count" event's info from the given e_list info (name, time)*/
void print_evt_list(struct evt  *e_list, int count);

/* startListen takes a port number and returns a listening descriptor on sucess or negavtive on error  */
int startListen(int port);

/* Responsbile for hanlding received messages from clients and responding to them accordingly
if the message is an action done, it'll save it in the log file and notify the client
if the message is a query about the events, it'll call the private function queryHandler(); to handle it
returns negative on ERROR*/
int handle_message(int sockDescriptor, struct sockaddr_in *client, char *recvMessage);

He leído que este error puede ser causado por tener una directiva de preprocesamiento escrita en más de una línea... pero no tengo eso. ¿Alguna idea de lo que estoy haciendo mal?

preguntado el 03 de mayo de 12 a las 17:05

Sería útil que señalara la línea 48:

Para descartar algún tipo de rareza de preprocesamiento de macros / misceláneas extrañas, debe verificar la salida preprocesada y ver si parece sensata. Con gcc esto se puede hacer usando el -E bandera. -

Ya dije que el error se da en ambas funciones put_evt y print_evt_list -

@Alguien: el -E La opción se ha sugerido un par de veces, pero intentemos una vez más: ¿qué hace el comando? gcc -E sourcefile.c | grep put_evt ¿decir? (ajustar para cualquier opción que pueda necesitar agregar para gcc para trabajar, como -I). -

esto es lo que dice... pero en realidad no significa nada significativo: int put_evt(struct evt *e); int put_evt(struct evt *e) @MichaelBurr-

4 Respuestas

el problema era que tenia struct evt declarado en otro lugar.

contestado el 10 de mayo de 12 a las 22:05

Tuve el mismo problema cuando tenía un archivo MAKE definido con el mismo nombre que el de una estructura. - vikasmk

Tuve el mismo problema al escribir una enumeración de códigos de error que tenía los mismos identificadores que los de error. - arnaudoff

Tuve el mismo problema con una definición en una biblioteca que sobrescribía una definición en otra biblioteca, aunque la definición en la que se informó el error no era la sobrescrita. En su lugar, informó el error en una definición utilizada en la definición sobrescrita. La solución más fácil fue mover la biblioteca menos dependiente que incluye después de que la biblioteca principal incluye para que pudiera mantener el mismo nombre sin interferir. - Flabú

creo que tienes #define e 2.71828183 o algo así en los encabezados anteriores.

Para estar seguro, ejecute el código a través del preprocesador y observe el resultado. En gcc eso es -E interruptor de línea de comando

contestado el 03 de mayo de 12 a las 17:05

y la solución para solucionarlo es...? - Varda Elentári

@Alguien: Cambie el nombre del prototipo para que tome un nombre de parámetro diferente: void print_evt(struct evt *ev); - Azur platino

Elimine el nombre del parámetro del prototipo, ya que es absolutamente innecesario allí. @alguien - alk

Entonces el problema debe ser otro. ¡Usa la opción -E! - usuario3458

Tuve exactamente el mismo problema y descubrí que struct evt se definió en otra ubicación

Respondido el 22 de junio de 13 a las 09:06

Intentaría cambiar el nombre de las funciones ligeramente. A veces, si uno de los encabezados define un token (como "put_evt") que usa, el preprocesador alterará su código.

contestado el 03 de mayo de 12 a las 17:05

No son las funciones... es algo justo después de la ( cerca de la función. - abelénky

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.