LINUX.ORG.RU

Возможно из-за того, что традиционно константы в C задаются макросами.

Deleted
()

чтобы сделать константным указатель надо писать так:

char * const s = "str"

тогда можно поймать сегфолт если s в read only memory или если в стеке, то можно перезаписать даже без ворнингов.

char * const s = "str";

void segfault(char **p)
{
        *p = "hello";
}       

int main(void)
{
        segfault((char **)&s);
        return 0;
}       

на счет нераспространенности не знаю

IvanR ★★★
()

Ты изменяешь не константу, а указатель на константные данные. Учи дальше.

wakuwaku ★★★★
()
Последнее исправление: wakuwaku (всего исправлений: 1)

Больше const богу const

const char* const

ну я в сишечке обычно так и пишу.

Константу можно изменить..

Ты меняешь не константу, а указатель на нее, чтобы получить константный указатель на константные данные и нужен второй const правее *

Stil ★★★★★
()

Ещё, я замечал, не принято указывать константность параметров в определениях функций и методов

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

константность параметров в определениях функций и методов

Потому что в С все передается по значению и *параметр* изменить нельзя. Именно потому изменяемые параметры передаются ссылкой/указателем, а тогда const писать является правилом хорошего тона.

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

Ещё, я замечал, не принято указывать константность параметров в определениях функций и методов

Какие вы, сука, замечательные.

Pavval ★★★★★
()

Откуда инфа, что не распространён. У нас в проекте вполне распространён. Пользуемся.

rha
()
Ответ на: комментарий от unanimous

Я про изменение аргумента, а не про изменение переменной, переданной по ссылке. Есть мнение, что это, так же как и const char* const улучшает читаемость кода. С другой стороны, это многословно. В расте с этим лучше, там константность по умолчанию.

urquan
()
Ответ на: комментарий от i-rinat

Наверное, так делать правильно, но в этом мало смысла.

Это просто делать не нужно — выдаёт человека, не знакомого с основами C. Имеет смысл только

void func(const int *s);

void func(const int& s);
unanimous ★★★★★
()
Ответ на: комментарий от unanimous

Я бы сказал разница между использованием того и другого велика.

void func(const int& s);

Декларирует, что параметр переданный по ссылке не будет меняться методом.

void func(const int* s);
Указывает, что данные, передаваемые в функцию - константны.

Так что аналог void func(const int& s); это как раз void func(const int s); ну или void func(const int* const s); если хотите передавать указатель.

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

void func(const int& s);
Декларирует, что параметр переданный по ссылке не будет меняться методом.

Для целого это бессмысленно. Пусть меняется как угодно, потому что меняться будет не сам параметр, а его копия.

akk ★★★★★
()
Последнее исправление: akk (всего исправлений: 1)
Ответ на: комментарий от proud_anon

Ты хочешь сказать, что это корректный код на C?

Разве в C появились ссылки?

Речь шла о том, что C++ наследует поведение C в том, что параметры передаются по значению.

unanimous ★★★★★
()
Ответ на: комментарий от i-rinat

Смысл в том, что компилятор знает, что переменная не меняется, т.е. можно спокойно в любое время занести ее в регистр/инлайнить и не думать о когерентности

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

компилятор надеется, что человек знает, что переменная не меняется

странно если бы человек не знал, зачем он написал const type const =)

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

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

IvanR ★★★
()
Ответ на: комментарий от i-rinat

Наверное, так делать правильно, но в этом мало смысла.

Местами сталкивался с требованием указывать const в реализации, а объявление будет без const.

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

DarkEld3r ★★★★★
()
Последнее исправление: DarkEld3r (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.