[英]How to determine return type, arguments, function name from C99 function declarations
[英]Is it correct C99 that you don't need to specify arguments in function pointer declarations in structs?
我編寫了以下C99代碼,並對結構聲明感到疑惑。 在其中我聲明了兩個函數指針,它們最終指向主代碼中的兩個push / pop方法。 在函數指針聲明中,我已經省略了參數,程序編譯好了。 它是否正確? 我確定我已經讀過必須提供的論據。 這是正確的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.
所以我猜它是正確的,但會喜歡另一種意見。
編輯:我遇到了上述“無關的舊式參數列表”錯誤,因為我使用的是typedef名稱'stack',而不是使用帶有'stack'的struct關鍵字來定義它是我當前定義的結構。
我正在使用Pelles C編譯器。
這是不好的風格(雖然合法)。 它會工作,但這意味着編譯器無法檢查您的參數。 所以,如果你不小心打電話給你的功能:
s.Push(arg, &s); // oops, reverse the arguments
編譯器將無法告訴您通話不好。
在ANSI標准化之前,K&R C沒有原型; 它只支持指定返回類型的聲明。 當你省略參數時,你正在使用這個古老的功能。
在gcc上,您可以使用選項-Wstrict-prototypes
在使用它們時啟用警告。
雖然它也在GCC下使用std=c99 -Wall -pedantic
,甚至沒有警告它,但我很驚訝它編譯完全。 在我看來,這不是很酷。
我相信使用以下內容會更好一點:
void* (*Pop)(struct stack*);
void (*Push)(struct stack*, void*);
它使用上述開關在GCC 4.2下編譯。
否則,看看你的代碼,我很可能會認為你用兩個參數調用Push會犯一個錯誤。 以上也編譯並清除了這種混亂。
gcc(使用-pedantic -Wall -std=c99
)對此代碼沒有問題:
typedef struct stack
{
int index;
void *stack[INITIAL_STACK_SIZE];
void* (*Pop)(struct stack *);
void (*Push)(struct stack *, void *);
} stack;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.