Ошибка, если я объявляю константу с #define или const в моей C-программе - PullRequest
0 голосов
/ 24 сентября 2011

Я использую gcc версии 4.3.2 (Debian 4.3.2-1.1).Я написал простую программу на C для реализации и тестирования целочисленного стека.Стек реализован структурой STACK.Я использовал константу с именем 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;

Ответы [ 3 ]

5 голосов
/ 24 сентября 2011

Удалите точку с запятой, это неправильно

#define STACKSIZE 10;
                    ^

Если вы сохраните его, препроцессор переведет int items[STACKSIZE]; в явно неправильный int items[10;];.

Для бита const есть C FAQ .

Значение константного объекта не является константным выражением в полный смысл термина , и не может использоваться для измерений массива, ярлыки на корпусах и т. п.

1 голос
/ 26 сентября 2011

Для дальнейшего использования вы можете просмотреть результаты препроцессора, используя опцию -E для gcc. То есть

gcc -E ex_stack1.c -o ex_stack1.i 

Изучение полученного файла ex_stack1.i сделало бы проблему более очевидной.

0 голосов
/ 24 сентября 2011

#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 против констант? ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...