我正在自学C,因为我的大学似乎对java很着迷,所以我正在写一个int类型的堆栈实现(不用担心以后会把它变成通用的)。我遇到了一个对我来说没有意义的错误missing ';' before 'type'
。据我所知,我的语法是对的,如果不是,请告诉我。无论如何,这是我的代码:
stack.h
typedef struct{
int *elements;
int size;
int capacity;
}Stack;
void newStack(Stack *s);
void delStack(Stack *s);
void pushToStack(Stack *s, int value);
int popFromStack(Stack *s);
stack.c
#include "stack.h"
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
void newStack(Stack *s){
s->size = 0;
s->capacity = 4;
s->elements = (int*) malloc(4 * sizeof(int));
assert(s->elements != NULL); // allocation worked?
}
void delStack(Stack *s){
free(s->elements);
}
void pushToStack(Stack *s, int value){
if(s->size == s->capacity){
s->size *= 2;
s->elements = (int *) realloc(s->elements, s->size * sizeof(int));
assert(s->elements !=NULL); //reallocation worked?
}
s->elements[s->size] = value;
s->size++;
}
int popFromStack(Stack *s){
assert(s->size>0);
s->size --;
return s->elements[s->size];
}
int main()
{
Stack s1;
newStack(&s1);
int i;
for(i=0; i<3; i++){
pushToStack(&s1, i);
printf("%d ", i);
}
printf("\n");
for(i=0; i<3; i++){
printf("%d ", popFromStack(&s1));
}
delStack(&s1);
getchar();
return 0;
}
错误发生在int i;
行的main中,但如果我移动该行,则错误消失,程序运行完美。我想知道原因。
导致错误:
newStack(&s1);
int i;
没有错误:
int i;
newStack(&s1);
PS:以防万一。使用MS Visual Studio 2010
答案 0 :(得分:8)
Visual Studio在1998年之前的某个时间段停留在一个时间循环中,当标准规定所有声明都应该在块的开头时。
这在C99中有所改变,MS确实说它支持最流行的功能。可悲的是,这不是其中之一。
答案 1 :(得分:1)
在C中,您必须在范围的开头声明所有变量。因此,在i
来电后,您无法声明newStack
。
答案 2 :(得分:1)
在C89中,声明在作用域的顶部进行,因此在任何其他函数调用之前进行。
然而,在C99中删除了此限制。