次の C99 コードを書きましたが、構造体宣言について疑問に思っていました。その中で、メイン コードの 2 つのプッシュ/ポップ メソッドを最終的に指す 2 つの関数ポインターを宣言します。関数ポインターの宣言では、引数を省略しましたが、プログラムは正常にコンパイルされます。これは正しいです?引数を指定する必要があることを読んだと確信しています。これは正しい C99 の動作ですか?
#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;
}
関数ポインターに引数を追加しようとしましたが、コンパイルエラーが発生したExtraneous old-style parameter list.
ので、正しいと思いますが、別の意見が欲しいです。
編集: 上記の「Extraneous old-style parameter list」エラーが発生しました。これは、「stack」で struct キーワードを使用するのではなく、typedef 名「stack」を使用して、現在定義している構造であると定義したためです。
Pelles Cコンパイラを使用しています。