Что такое новый QChar* в C23?

cppreference показывает эти прототипы для strchr():

char *strchr( const char *str, int ch );     (1)    
/*QChar*/ *strchr( /*QChar*/ *str, int ch ); (2) (since C23)

и предлагает такое объяснение второй версии:

Типовая функция, эквивалентная (1). Пусть T — неквалифицированный символьный тип объекта.

  • Если str имеет тип const T*, тип возвращаемого значения — const char*.
  • В противном случае, если str имеет тип T*, тип возвращаемого значения — char*.
  • В противном случае поведение не определено.

Что это QChar*? Это новый тип?

Если да, то поддерживают ли его уже GCC и/или Clang? Могу ли я использовать его в своем собственном коде приложения?

Возможно, будет полезное чтение. Это был один из первых результатов поиска в Google «qchar c23».

Chris 18.05.2024 00:18

См. open-std.org/jtc1/sc22/wg14/www/docs/n3020.pdf

Shawn 18.05.2024 00:18

По сути, позволяет прозрачно использовать strchr() и некоторые другие функции с константными или неконстантными указателями на символы и получать обратно тот же тип.

Shawn 18.05.2024 00:20

Здесь я написал небольшой обзор изменений C23, которые, скорее всего, повлияют на среднего программиста: Что такое C23 и почему меня это должно волновать?

Lundin 20.05.2024 11:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
4
127
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В течение многих лет strchr() (и некоторые другие функции) принимали аргумент указателя на константный символ (на строку, заканчивающуюся нулем) и возвращали неконстантный указатель на место где-то внутри строки (что может быть проблематичным, если кто-то затем попытается написать в это место через этот указатель, хотя он не должен быть изменяемым). Новые версии Qualified Char представляют собой универсальные функции, которые при передаче указателя const char возвращают указатель const char, а при передаче обычного указателя char возвращают то же самое.

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

Я не знаю, поддерживают ли это какие-либо компиляторы/стандартные библиотеки.

Shawn 18.05.2024 00:28

Я реализовал basename() и подумал, что смогу использовать это QChar * в качестве аргумента и типа возвращаемого значения.

Harith 18.05.2024 00:34

@Харит, это не настоящий тип (обратите внимание, как это закомментировано в документации cppreference?). Вам придется что-то сделать с _Generic(), чтобы получить эффект.

Shawn 18.05.2024 00:37

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

Harith 18.05.2024 00:39

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

IS4 18.05.2024 00:41

В связанном PDF-файле есть пример реализации макросов, но он связан с темной магией, которую я не понимаю.

Shawn 18.05.2024 00:43

@harith Стандартная реализация библиотеки может выглядеть примерно так: godbolt.org/z/91Yc4rbMr. Можно использовать _Generic для квалифицированных типов указателей, а не только для простых переменных, поскольку операнд _Generic подвергается «преобразованию lvalue» (согласно C17). Говоря простым языком, он может определить разницу между const char* и char*, но не между const char и char.

Lundin 20.05.2024 11:34

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

Harith 20.05.2024 11:37

Другие вопросы по теме