Я знаю, что при объявлении массива я должен указать свой размер с постоянным значением, но в этом случае я создаю значение 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++, я хотел бы знать причину этих ошибок, так как я не получил ее достаточно хорошо. Может кто-нибудь дать мне объяснение? Заранее спасибо!
Спасибо, что заставляет меня лучше понимать ошибку в CASE I, я не знал, что ключевое слово extern объявляет время выполнения, когда значение const в массиве должно быть известно во время компиляции. Большое спасибо!! Есть ли у вас какие-либо идеи об ошибке в CASE II? –
@ Pj-, см. Обновленный ответ. –