Jump to content

    

Си строки. Мир рухнул...

4 минуты назад, demiurg_spb сказал:

Дайте ссылку что-ли на стандарт где хоть как-то упоминается о том что Си приводит  char const * -> char *.

Он не приводит. Цитата из стандарта есть по вашей же ссылке из первого сообщения:

Цитата

5 In translation phase 7, a byte or code of value zero is appended to each multibyte character sequence that results from a string literal or literals. The multibyte character sequence is then used to initialize an array of static storage duration and length just sufficient to contain the sequence. For character string literals, the array elements have type char, and are initialized with the individual bytes of the multibyte character sequence [...]

6 It is unspecified whether these arrays are distinct provided their elements have the appropriate values. If the program attempts to modify such an array, the behavior is undefined.

Да, очень плохо, что вместо 6-го пункта не сделали массив константным, но так уж повелось с самых первых версий.

Share this post


Link to post
Share on other sites
17 минут назад, demiurg_spb сказал:

Это правильный пример в контексте необходимости дублирования функций (const и не const) для достижения целей оптимизации.

Дайте ссылку что-ли на стандарт где хоть как-то упоминается о том что Си приводит  char const * -> char *.

Я такого не говорил. Я говорил что для foo("...") будет неявное приведение типа char const * литеральной константы "..." к типу char *.

Вы сами в первом посте привели такой пример где у вас было приведение. Или как Вы умудрились передать константную строку в свою функцию foo(char *)???

Либо явно приводили её тип, либо вызывали foo("...").

Какой ещё стандарт нужен? Сами же и привели пример работы в первом посте.

Share this post


Link to post
Share on other sites

Ладно. Обсуждать тут больше нечего.

Ко всему можно привыкнуть. Удивляет лишь молчаливая компиляция заведомо нерабочего кода.

Вроде как язык со строгой типизацией, но такой странной...

35 minutes ago, Сергей Борщ said:

Да, очень плохо, что вместо 6-го пункта не сделали массив константным, но так уж повелось с самых первых версий.

Логичнее было бы какой тип слева от равно (const не const) туда и класть элементы.

И тогда всё само собой бы разрулилось.

int printf( const char *format, ... ); // всё бы в RO закинулось, а в моём примере в RW

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now