2016-11-20 3 views
0

Я знаю, что при объявлении массива я должен указать свой размер с постоянным значением, но в этом случае я создаю значение const, которое также является выражением const , инициализируется с буквальным значением, которое может быть оценено при составлении времени, но я продолжаю имея ошибку на этих двух случаях:C++: ошибка инициализации массива с константой переменной в нескольких файлах

СЛУЧАЙ I:

Stack.h

#ifndef STACK_H 
#define STACK_H 

extern const unsigned MAX; 

class Stack { 

public: 
    /* Declarations here ... */ 

private: 
    unsigned n; 
    int stack[MAX]; 

}; 

#endif // STACK_H 

Stack.cpp

#include <iostream> 
#include "Stack.h" 

extern const unsigned MAX = 5; 

Stack::Stack() { 
    this->n = 0; 
} 

int Stack::pop() { 
    int pop = -1; 

    if (n > 0) { 
     pop = this->stack[n - 1]; 
     this->stack[n - 1] = 0; 
     --n; 
    } else { 
     std::cout << "StackUnderFlowException:: Stack Data Structure is Empty!" << std::endl;; 
    } 

    return pop; 
} 

int Stack::getStackTop() { 
    return this->n > 0 ? this->stack[n - 1] : -1; 
} 

void Stack::push(int v) { 
    if (n < MAX) { 
     this->stack[n] = v; 
     ++n; 
    } else { 
     std::cout << "StackOverFlowException:: Stack Data Structure is Full!" << std::endl; 
    } 
} 

Ошибка:

In file included from p38.cpp:2: 
./Stack.h:18:6: error: fields must have a constant size: 'variable length array in structure' extension will never be supported 
     int stack[MAX]; 
      ^
1 error generated. 
In file included from Stack.cpp:2: 
./Stack.h:18:6: error: fields must have a constant size: 'variable length array in structure' extension will never be supported 
     int stack[MAX]; 
      ^

И все становится еще более странно, во втором случае ...

СЛУЧАЙ II:

Stack.h 

#ifndef STACK_H 
#define STACK_H 

extern const unsigned MAX = 5; 

class Stack { 

public: 
    Stack(); 
    int pop(); 
    int getStackTop(); 
    void push(int v); 
    bool isEmpty(); 
    void printStack(void) const; 

private: 
    unsigned n; 
    int stack[MAX]; 

}; 

#endif // STACK_H 

Stack.cpp

#include <iostream> 
#include "Stack.h" 

using namespace std; 

Stack::Stack() { 
    this->n = 0; 
} 

/* Больше трески е здесь ... */

Ошибка:

duplicate symbol _MAX in: 
    /var/folders/r3/zbrrqh7n5tg0vcnpr9_7j0nr0000gn/T/p38-ac46b9.o 
    /var/folders/r3/zbrrqh7n5tg0vcnpr9_7j0nr0000gn/T/Stack-a5d98e.o 
ld: 1 duplicate symbol for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Я исправил СЛУЧАЙ II просто удалив Экстерн ключевое слово, и тогда я был установлен с помощью #define MAX 5 в заголовке вместо того, чтобы использовать некоторые постоянная переменная, вещь даже жесткая Я исправил проблему, я хочу лучше понять C++, я хотел бы знать причину этих ошибок, так как я не получил ее достаточно хорошо. Может кто-нибудь дать мне объяснение? Заранее спасибо!

ответ

1

Существует разница между константой времени компиляции и постоянной времени выполнения.

extern const unsigned MAX; 

объявляет постоянную времени выполнения, а не константу времени компиляции. Он может быть инициализирован 5, 10, 20 или что-либо еще во время выполнения. После инициализации его значение остается постоянным.

Поскольку это не постоянная времени компиляции, она не может использоваться как размер массива.

Чтобы использовать это время, как при компиляции постоянной, использование:

const unsigned MAX = 5; 

в .h файле.


extern const unsigned MAX = 5; 

не работает так, что не только объявляет переменную, но определяет это слишком. Любой файл .c, который #include s .h-файл заканчивает определение переменной, которая объясняет дубликат символа ошибки компоновщика.

+0

Спасибо, что заставляет меня лучше понимать ошибку в CASE I, я не знал, что ключевое слово extern объявляет время выполнения, когда значение const в массиве должно быть известно во время компиляции. Большое спасибо!! Есть ли у вас какие-либо идеи об ошибке в CASE II? –

+0

@ Pj-, см. Обновленный ответ. –

0

int stack [MAX];

Ваша ошибка лежит здесь, у вас есть обязательный размер. e.g int stack [20];

Смежные вопросы