Инициализировать указатель двумерного массива на глобальный символ - PullRequest
1 голос
/ 26 августа 2010

У меня есть двумерный массив указателей на char и инициализация его в заголовочном файле. Проблема заключается в следующем: он не жалуется на получение const char[], но не любит, когда я назначаю const char* (как показано в коде). Это дает мне ошибку "элемент инициализатора не является константой".

const char lang[8] = "English";

const char * langPtr = "English 1";

const char * optionPtr[3][10] = {

    {lang, 0, 0, 0, 0, 0, 0, 0, 0, 0, },

    {langPtr, 0, ...},    

    {...}

};

Я думал, что lang и langPtr оба указывают на начало строки, поэтому должны быть в состоянии сделать это. Я хочу использовать указатель для инициализации 2D-массива. Есть ли способ сделать это глобально?

Ответы [ 2 ]

2 голосов
/ 26 августа 2010

В C элементы в инициализаторах для статических объектов должны быть «постоянными выражениями» (все глобальные объекты являются статическими). ​​

Адрес статического объекта - это «постоянная адреса», которая является своего рода«постоянное выражение» - вот почему lang работает.Значение переменной - даже переменной const (хотя обратите внимание, что langPtr само по себе не является const) - не"константным выражением", поэтому langPtr не работает.

Обратите внимание, что это отличается в C ++, где const квалифицированные переменные являются подлинными константами.

0 голосов
/ 26 августа 2010

* langPtr - это символ «E», а не указатель на этот символ.

Редактировать: К сожалению вопрос изменился, и теперь вы используете langPtr, а не * langPtr. Я посмотрю еще раз.

Хм. Хорошо, извините, я, вероятно, должен предлагать комментарии, а не ответ, но начав ответ, я продолжу его.

Интересно, что ваш код хорошо компилируется на C ++, а не на C, что, вероятно, можно считать индикатором тонкой проблемы.

Сообщение об ошибке компилятора буквально правильно. Идентификатор langPtr является переменной, а не константой, поскольку вы можете изменить langPtr так, чтобы он указывал на другие постоянные символы.

Обходной путь - заменить строковый литерал "English 1" вместо использования langPtr в массиве. Тот же обходной путь, выраженный немного по-другому, заключается в использовании препроцессора для определения langPtr, поэтому;

#define langPtr "English 1"

По общему признанию, это ужасно, но, возможно, это удовлетворит ваши потребности.

Наконец, я бы посоветовал не инициализировать любой массив в заголовочном файле. Объявите переменные в заголовочных файлах. Определить (т.е. инициализировать) переменные в файлах .c.

Удачи.

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