Я экспериментировал с GCC и обнаружил, что вы можете объявлять внешние переменные const
в заголовочных файлах, но сохраняйте их изменяемыми в файлах реализации.Объявление глобальной переменной `extern const int` в заголовке, но только` int` в исходном файле
EDIT: Это действительно не работает. Единственная причина, по которой я получил свой тестовый код для компиляции, состояла в том, что я не включил «header.h» в «header.c».
header.h:
#ifndef HEADER_H_
#define HEADER_H_
extern const int global_variable;
#endif
header.c:
int global_variable = 17;
Это кажется очень хорошая особенность, чтобы использовать для хранения global_variable
чтения для пользователей header.h
но держать их modifable самая осуществление (header.c
).
ПРИМЕЧАНИЕ: Следующий код является лишь примером того, как этот способ объявления предотвратит присвоение global_variable
.
#include "header.h"
int main(void)
{
global_variable = 34; /* This is an error as `global_variable` is declared const */
return 0;
}
Потому что я никогда не видел техники на практике раньше. Я начинаю задаваться вопросом, действительно ли это.
Является ли это четко определенным поведением или это ошибка, о которой GCC не предупреждает меня?
Какая точная формулировка ошибки (скопируйте и вставьте ее)? –
Я бы сбила с толку, что переменная const может вообще измениться. Я бы ограничил область с помощью static и предоставил функцию, чтобы вернуть текущее глобальное значение, чтобы получить тот же эффект. – ryanpattison
Единственный способ, которым это может работать, - это если заголовок // не включен ** в header.c. Если включить header.h в header.c, то присваивание ** будет ** давать синтаксическую ошибку. Если это делается в реальной программе с 1000-ю строками кода, а что-то не так - как легко это исправить? –