Это единственное использование, которое я могу придумать:
const struct S {
int a;
int b;
} s;
Это объявляет структуру и сразу создает для нее экземпляр с именем s
, и в этот момент a
и b
в s
инициализируются равными 0 (обратите внимание, что в этой точке s является глобальной переменной в единице перевода, в которой она была объявлена и может быть внешне связана с).
printf("a = %d\t b = %d\n", s.a, s.b); // a = 0 b = 0
Если вы попытаетесь установить элементы s
, у вас не получится:
s.a = 1; //error: assignment of member ‘a’ in read-only object
Итак, s
здесь не очень полезен ... если вы не сделаете что-то вроде:
const struct S {
int a;
int b;
} s = { 1, 2 };
Теперь давайте создадим еще один экземпляр той же структуры (объявление остается таким же, как указано выше):
struct S other;
other.a = 1;
other.b = 2;
printf("a = %d\t b = %d\n", other.a, other.b); // a = 1 b = 2
Компилятор больше не будет жаловаться, так как other
не является константой! только s
является постоянным!
Теперь, что это const
делает, спросите вы? давайте попробуем изменить s:
s = other; // error: assignment of read-only variable ‘s’
Вот и все. Если вам не нужно, чтобы компилятор выделял хранилище для s
в точке объявления и все еще требовался экземпляр s
, то вы просто добавили бы const
в момент создания struct S
(обратите внимание на заглавную S !!)
Бонус 1
const struct S {
int a;
int b;
};
Обратите внимание, что больше нет маленьких s
. На этом этапе GCC предупредит , что квалификатор const
ничего не делает !!!!
Бонус 2
Если вы хотите, чтобы каждый экземпляр структуры был const, то есть его члены могут быть инициализированы только в той точке определения, которую вы можете сделать, как (используя typedef):
typedef const struct S {
int a;
int b;
} s;
// The wrong way
s thisIsAnS;
thisIsAnS.a = 1; //error: assignment of member ‘a’ in read-only object
// The correct way
s thisIsAnS = { 1 , 2 }; //compiles fine, but you can not change a or b anymore
Заключение
Для меня это просто синтаксический сахар и только добавляет ненужную сложность в код. Но кто я такой, чтобы судить ...