Это единственное использование, о котором я могу думать:
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
Если вы хотите, чтобы каждый экземпляр структуры был константным, то есть его члены могут быть инициализированы только в точке определения, которую вы можете сделать (используя 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
Заключение
Для меня это просто синтаксический сахар, который только усложняет код. Но кто я такой, чтобы судить...
person
Saeid Yazdani
schedule
28.07.2018
main. Ни один из этих типов не является тем, чем должен быть --int. Я не могу вспомнить, разрешено ли вам определять тип в определении функции (и в любом случае не совсем понятно, на каком языке вы компилируете этот код), это может быть дополнительной ошибкой. - person Steve Jessop   schedule 04.10.2011void main(void)не разрешено. - person Kerrek SB   schedule 04.10.2011