LINUX.ORG.RU
ФорумTalks

char* и const char*


1

1

Скажите, вас не раздражает, когда компилятор ругается на приведение const char* к char*?

Меня раздражает, хоть я и знаю разницу между ними.

★★★★★

попей таблеточек, если раздражает

компилятор фуфла не гонит

Harald ★★★★★
()

приведение const T к T - невозможна в общем случае. Тебя раздражает соблюдать синтаксис и грамматику языка?

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

Почему ? Не вижу, что мешает.

ну мало ли, какая-нибудь гарвардская архитектура, указатель на код и указатель на данные, все дела

Harald ★★★★★
()

Сторонние библиотеки юзаешь? Тогда терпии.

Сам принимаешь char* где можно было бы принять const char*? Тогда страдай.

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

Const - это всего лишь указание компилятору укладывать переменную в ПЗУ либо RO сегмент. Ну подумаешь, станет оно не RO, преобразование-то почему не возможно ? А конкретно с char* - я вообще не понимаю, в чём такая запарка, что выдавать ошибку компиляции. С помощью const защищается-то только сам указатель, по данным пиши, устраивай разврат, нет проблем. В обоих случаях это сегмент данных, я что-то никак не пойму проблемы.

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

А наоборот, char к const char почему не ругается?

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от Deleted

Вступай в комитет С, бро

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

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

Я про С речь и веду - вступай в комитет С и вноси рацпредложение об убирании этой фичи из языка.

Deleted
()
Ответ на: комментарий от cvs-255

const char* - указатель на константу

Нееее. Это константный указатель. Указатель на константу - cost char [10]. Или «Hello, world !».

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

ленин, хорошь уже тролить. Хотя тут не dev, пожалуй свалю сам

Deleted
()
Ответ на: комментарий от lenin386
#include <stdio.h>
int main(void)
{
        const char *ptr = "abcd";
        ptr++;
        printf("%s\n", ptr);

        char * const ptr2 = "pqrs";
        ptr2++;

        return 0;
}

посмотри, где ошибка будет

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от lenin386

Почему ?

Потому что параграф 6.3.2.3 стандарта ANSI C99 чётко определяет случаи, для которых возможно приведение типов указателей. Среди прочих пунктов там еcть «For any qualifier q, a pointer to a non-q-qualified type may be converted to a pointer to the q-qualified version of the type». Обратного не предусмотрено. Посему, приведение char* к const char* корректно, а const char* к char* — нет.

fang
()

Где тег «я учусь программировать»?

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

А потом все жалуются, что программы на святой Сишке сегфолтятся.

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

И вот так мы плавно переходим к следующему вопросу:

Скажите, вас не раздражает, когда компилятор ругается на приведение const GString* к GString*?

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

Чтобы гарантировать¹, что вызываемая функция не испортит твою строку.

1) В случае если этот код соблюдает стандарт или, хотя бы, автор — не мудак.

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

в случае если в системе есть действительно read only memory, адресуемая не так, как ram, то это попытка преобразовать const char* к char* может обернуться фэйлом

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от CARS

А если человеку надо указатель на блок байт (например битман) или просто он получил последовательность байт от вервера, но кодировки не знает, и не знает как их в этот твой string запихнуть :)

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

в c++ можно использовать std::vector<char> для тких вещей

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

Чтобы желающих нагадить в переменную бил по рукам компилятор, а не ты :)
Если функция не должна менять ничего, значит не должна. Кроме того, если много функций и где-то вдруг почему-то непонятным образом что-то в переменной/памяти меняется - сразу видно, в каких функциях проблемы быть не может по определению.

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

Если функция не должна менять ничего, значит не должна

Я считаю это извращением! Если ты не хочешь менять аргумент — не меняй его. Нахрен там const писать и усложнять жизнь людям? Я уже с ffmpeg тут на..лся: какой-то [censored] забульбенил кучу const, в итоге приходится хрен те какие конструкции по приведению типов рисовать! Извращенцы!!!

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

Утрировано: было бы прикольно, если бы strlen обрубала строку :)

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

См. ссылку выше на swscale. Из-за этих извращенцев приходится явно преобразовывать типы! А могли бы не писать const, тогда и код красивее был бы!!!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от grondek

Хм, почему-то gcc не матюкается на strlen. Странно...

cat 1.c
#include <stdio.h>
#include <string.h>

int main(int c, char **v){
    if(c == 1) return 1;
    printf("len of arg \"%s\" == %zd\n", v[1], strlen(v[1]));
    return 0;
}

gcc 1.c -Wall -Werror -Wextra -W -o strlentest && ./strlentest "некая фраза"
len of arg "некая фраза" == 11
Eddy_Em ☆☆☆☆☆
()

Использую string и не испытываю баттхёрта.

CYB3R ★★★★★
()

раздражает. но ЕМНИП, для const char* компилятор может делать определённого рода оптимизации, какие нельзя сделать для просто char*

next_time ★★★★★
()

Не раздражает. Наоборот - хорошо, что предупреждает, если я делаю что-то не так.

А наоборот, char к const char почему не ругается?

А чем опасно использование RW участков памяти только для чтения?

segfault ★★★★★
()

Раздражает когда наоборот - char* к const char*.

hateyoufeel ★★★★★
()

не раздражает, а напоминает если я лажаю.

waker ★★★★★
()

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

oneliner
()

Раздражать не может. Язык таков. Напоминает о косяках.

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

Это может быть физически разная память. И если строка оказалась в rom, а потом ты указатель на нее привет к типу char*, указывающий на данные в ram, то это чревато невозможностью скомпилировать.

cvs-255 ★★★★★
() автор топика

Меня гораздо больше раздражают те, кто не умеет правильно использовать char* и const char*. Если на ваш код компилятор выдаёт этот ворнинг, то ваш код — г?вно.

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

const char * - указатель на константные данные. Как раз указатель можно и менять.

По теме: приведение const char * к char * с последующим изменением содержимого может привести к очень ... ммм ... весёлым последствиям.

Deleted
()

Меня раздражает

А ты ему в следующий раз в табло с размаху!

Вот так надо с компилятором махаться.

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