簡體   English   中英

是否正確C99,您不需要在結構中的函數指針聲明中指定參數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM