He escrito el siguiente código C99 y me preguntaba sobre la declaración struct. En él, declaro dos punteros a función que finalmente apuntan a los dos métodos push/pop en el código principal. En las declaraciones del puntero a la función, he omitido los argumentos y el programa compila bien. ¿Es esto correcto? Estoy seguro de que he leído que los argumentos deben ser proporcionados. ¿Es este comportamiento correcto de C99?¿Es correcto C99 que no necesite especificar argumentos en declaraciones de puntero a función en estructuras?
#include <stdio.h>
#define INITIAL_STACK_SIZE 1000
typedef struct stack
{
int index;
void *stack[INITIAL_STACK_SIZE];
void* (*Pop)(); //<-- Is this correct?
void (*Push)(); //<-- Is this correct?
} stack;
stack CreateStack(void);
void PushStack(stack*, void *);
void *PopStack(stack*);
stack CreateStack(void)
{
stack s = {0, '\0'};
s.Pop = PopStack;
s.Push = PushStack;
return s;
}
void PushStack(stack *s, void *value)
{
if(s->index < INITIAL_STACK_SIZE)
{
s->stack[s->index++] = value;
}
else
{
fputs("ERROR: Stack Overflow!\n", stderr);
}
}
void *PopStack(stack *s)
{
if(s->index > 0)
{
return s->stack[--s->index];
}
else
{
fputs("ERROR: Stack Empty!\n", stderr);
return NULL;
}
}
int main(int argc, char *argv[])
{
stack s = CreateStack();
s.Push(&s, "Hello");
s.Push(&s, "World");
printf("%s\n", (char*)s.Pop(&s));
printf("%s\n", (char*)s.Pop(&s));
return 0;
}
He intentado añadir los argumentos de los punteros de función, pero tengo un error de compilación de Extraneous old-style parameter list.
así que supongo que es correcto, pero le encantaría otra opinión.
EDIT: Estaba experimentando el error 'Extraño de lista de parámetros antiguos' porque estaba usando el nombredef 'pila' en lugar de usar la palabra clave struct con 'pila' para definir que era la estructura que actualmente estoy definiendo .
Estoy usando el compilador Pelles C.
De hecho, estaba cometiendo un error en mi código. Estaba usando el nombre typedef 'stack' en lugar de usar la palabra clave struct con 'stack' para definir que era la estructura que actualmente estoy definiendo. Gracias. –
Sí, cometí el mismo error la primera vez que lo intenté, así que pensé que ese podría haber sido tu problema también. – zneak
No fue grosero, pero di la misma respuesta dos minutos antes de zneak. – Trent