我使用的是gcc 4.3.2 (Debian4.3.2-1.1)版本。我用C语言写了一个简单的程序来实现和测试整数堆栈。栈是由栈结构实现的。我使用了一个名为STACKSIZE的常量来定义堆栈的大小。我的程序代码如下所示:
#include<stdio.h>
#include<stdlib.h>
#define STACKSIZE 10;
typedef struct {
int size;
int items[STACKSIZE];
} STACK;
void push(STACK *ps, int x)
{
if (ps->size == STACKSIZE) {
fputs("Error: stack overflow\n", stderr);
abort();
} else
ps->items[ps->size++] = x;
}
int pop(STACK *ps)
{
if (ps->size == 0){
fputs("Error: stack underflow\n", stderr);
abort();
} else
return ps->items[--ps->size];
}
int main() {
STACK st;
st.size = 0;
int i;
for(i=0; i < STACKSIZE + 1; i++) {
push(&st, i);
}
while(st.size != 0)
printf("%d\n", pop(&st));
printf("%d\n", pop(&st));
return 0;
}
当我使用#define STACKSIZE 10;
时,gcc会返回以下错误:
ex_stack1.c:8: error: expected ‘]’ before ‘;’ token
ex_stack1.c:9: warning: no semicolon at end of struct or union
ex_stack1.c: In function ‘push’:
ex_stack1.c:13: error: expected ‘)’ before ‘;’ token
ex_stack1.c:17: error: ‘STACK’ has no member named ‘items’
ex_stack1.c: In function ‘pop’:
ex_stack1.c:26: error: ‘STACK’ has no member named ‘items’
ex_stack1.c: In function ‘main’:
ex_stack1.c:33: error: expected ‘)’ before ‘;’ token
当我使用
const int STACKSIZE=10;
gcc将返回以下错误:
ex_stack1.c:8: error: variably modified ‘items’ at file scope
当我使用
enum {STACKSIZE=10};
gcc就会把我的程序编译成功。
发生了什么?我应该如何修改我的程序以使用
#define STACKSIZE 10;
或
const int STACKSIZE=10;
发布于 2011-09-24 09:06:40
去掉分号,这是错的
#define STACKSIZE 10;
^
如果你保留它,预处理器将把int items[STACKSIZE];
翻译成明显错误的int items[10;];
。
对于const
位,有一个C FAQ。
常量限定对象的值不是术语完全意义上的常量表达式,不能用于数组维度、大小写标签等。
发布于 2011-09-26 15:20:25
为了便于将来参考,您可以使用-E选项来查看预处理器的结果。那是,
gcc -E ex_stack1.c -o ex_stack1.i
检查生成的ex_stack1.i文件会使问题变得更加明显。
发布于 2011-09-24 09:12:41
#define
进行文本替换。由于您具有以下特性:
#define STACKSIZE 10;
然后
typedef struct {
int size;
int items[STACKSIZE];
} STACK;
变成:
typedef struct {
int size;
int items[10;];
} STACK;
在C中,const
用于声明不能(很容易)修改的变量。它们不是编译时常量。
但是,enum
确实定义了编译时常量。一般来说,在可能的情况下,您应该更喜欢enum
而不是const int
,而不是#define
。(参见Advantage and disadvantages of #define vs. constants? )。
https://stackoverflow.com/questions/7538053
复制相似问题