如果在C程序中使用#define或const声明常量,则会出错



我使用的是gcc版本4.3.2 (Debian 4.3.2-1.1)。我用C写了一个简单的程序来实现和测试一个整数堆栈。栈是由Stack结构实现的。我使用了一个名为STACKSIZE的常量来定义STACK的大小。我的程序代码看起来像这样:

#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 overflown", stderr);
        abort();
    } else
        ps->items[ps->size++] = x;
}
int pop(STACK *ps)
{
    if (ps->size == 0){
        fputs("Error: stack underflown", 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("%dn", pop(&st));
    printf("%dn", 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;

去掉分号,这是错误的

#define STACKSIZE 10;
                    ^

如果你保留它,预处理器将把int items[STACKSIZE];翻译成明显错误的int items[10;];

对于const位,有C常见问题解答。

const限定对象的值不是中的常量表达式的完整含义,不能用于数组维度,大小写标签等。

为了将来参考,您可以通过使用gcc的-E选项来查看预处理器的结果。也就是说,

gcc -E ex_stack1.c -o ex_stack1.i 

检查结果ex_stack1。

#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。(参见#define与常量的优缺点?).

最新更新