Как правильно определить const int в .h файле? - PullRequest
2 голосов
/ 19 ноября 2010

В проекте мне нужно определить const int, я определяю его в заголовке как:

 extern const int a;

И я включаю этот заголовок много раз.Затем в одном исходном файле я помещаю:

const int a=10;

Однако, когда мне нужно использовать a в привязке к массиву;т.е.:

int anarray[a];

Я получаю:

"array bound is not an integer constant"

ошибка.Почему?

Ответы [ 3 ]

12 голосов
/ 19 ноября 2010

Граница массива должна быть целочисленным константным выражением .Чтобы быть целочисленным константным выражением , выражение должно включать (среди прочего) литералы, enum значения и const переменные или static члены данных только в том случае, если они инициализированыс константными выражениями .

const переменные целочисленного типа не являются целочисленными константами-выражениями , если они не имеют инициализатора.

Это правило языка, которое позволяет реализации знать определенные постоянные значения во время компиляции, не имея необходимости знать о других единицах перевода (которые не могут быть скомпилированы одновременно и которые могут быть изменены независимо).

* Переменные 1021 * в области имен имеют внутреннюю связь по умолчанию (т. Е. Без явного extern), поэтому у вас не будет проблем с множественным определением, если вы сделаете что-то подобное.

// header.h
const int a = 10;

.

// source.cpp
int anarray[a];
5 голосов
/ 19 ноября 2010

Размерность массива должна быть известна во время компиляции. Для таких констант вы можете использовать перечисление enum. Таким образом, его значение отображается в заголовке, и вы все равно получаете символическое имя при отладке (в отличие от использования #define).

// foo.h

enum {
    a = 10; // array dimension
};

и

// foo.c

#include "foo.h"

int anarray[a];
2 голосов
/ 19 ноября 2010

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

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