LINUX.ORG.RU

Для компилятора неважен. Важен только для человека. С одной стороны заголовочник не должен зависеть от деталей реализации и затруднять чтение, квалификатор const смысла не имеет - переменная всё равно копируется в стек. В реализации же нужно использовать тот квалификатор, который приемлимее, так как реализация оперирует копией переменной, например:

void doSomething( int value, const char * string );

void doSomething( const int value, const char * const string )
{
...
}

Dendy ★★★★★
()

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

иначе, вызывая функцию foo(char *s) командой foo("hello, world"); , возникает ошибка несовместимости типов.

anonymous
()

с указателями как сказано выше это нормальная практика. В вылизанных библиотеках даже обязательная.

для неуказателей -- писать const в декларациях функций нет абсолютно никакого смысла. Писать const в определении функции смысл самый минимальный. По факту большинство аргументов не меняются в функциях, и компилятор может определить это сам.

dilmah ★★★★★
()
Ответ на: комментарий от anonymous

Не путайте квалификатор для указателя и для данных по этому указателю. Очевидно автор спрашивал про первое. Если так, то обьявления в заголовочнике конструкций

void foo( const int value );
void bar( char * const string );

не имеют смысла.

Dendy ★★★★★
()
Ответ на: комментарий от Dendy

> Для компилятора неважен. Важен только для человека.

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

Eshkin_kot ★★
()
Ответ на: комментарий от Eshkin_kot

Для параметра это бессмысленно. Никто не мешает сделать каст и снять константность, и это будет вполне легитимным кодом. Я уже не говорю про указателях. Компилятору может помочь система типов как в D, где есть понятие invariant-ных переменных, кто их нарушает — ССЗБ.

const нужен в первую очередь для самодокументируемости функций.

Legioner ★★★★★
()
Ответ на: комментарий от Eshkin_kot

> хмм... насколько я знаю его как раз и вводили в язык что бы помочь компилятору в плане упрощения оптимизации и размещения подобных пременных...

Это справедливо для констант, при обьявлении которых используется тот же квалификатор. Не нужно путать их с немутабельными переменными.

В первую очередь программа пишется для человека, а не для машины. И именно с этой точки зрения const позволяет ликвидировать множество потенциальных ошибок уже на этапе обьявления переменной. Программа стаёт читабельнее и, как правильно заметили - самодокументируемой.

Dendy ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.