|
Возврат значения char */char const * |
|
|
|
May 10 2017, 10:28
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Имеется функция: char *StrFunc(char const *str) {} Внутри она использует str именно как char const * (только чтение) и потом возвращает например: str+N (N - типа int). Но в качестве вх. аргумента в неё могут передаваться как char * так и char const * - нет проблем, приведение типа делается автоматом. Но хочется, чтобы и возвращаемое значение было того же типа, что и передано: для char * - char *, для char const * - char const *. Чтобы не было необходимости делать: char const *s; ... ; s = (char const *)StrFunc(s); Понятно, что можно объявить inline функцию, в которой сделать приведение к нужному типу. Но тогда, с низким уровнем оптимизации, функция не будет заинлайнена. Или можно перегрузить эту функцию с другим типом аргумента/возвращаемого значения - опят будут две функции, выполняющие одно действие. Может есть более элегантное решение? Как бы так объявить алиас для данной функции с другим типом аргумента/возвращаемого значения?
|
|
|
|
|
 |
Ответов
|
May 10 2017, 10:38
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(jcxz @ May 10 2017, 13:28)  Имеется функция: char *StrFunc(char const *str) {} Внутри она использует str именно как char const * (только чтение) и потом возвращает например: str+N (N - типа int). Функция принимает указатель на const, возвращает указатель по сути на тот же объект, но убирает const. Это нечестно. То есть должно быть 2 функции: Код char* f1(char* s); const char* f2(const char* s); Причём код внутри одинаковый. Немного жаль, что в языке нет элегантного способа это разрулить. Предложение такое: Код const char* f2(const char* s); #define f1(s) (char*)f2(s) Проверка типов сохраняется, всё работает. Логично?
|
|
|
|
|
May 10 2017, 11:52
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(scifi @ May 10 2017, 12:38)  Причём код внутри одинаковый. Немного жаль, что в языке нет элегантного способа это разрулить. Я об этом и говорю. Цитата(scifi @ May 10 2017, 12:38)  Предложение такое: Код const char* f2(const char* s); #define f1(s) (char*)f2(s) Проверка типов сохраняется, всё работает. Логично? Плохое решение. Две имени (функций) выполняющие одно и то же действие. И придётся каждый раз думать - какое имя подставить. Цитата(Сергей Борщ @ May 10 2017, 13:41)  Не используйте столь низкие уровни оптимизации. А как жить тогда? Ведь уже при уровне "Medium" не производится inlining, а при более высоких - отладка практически невозможна.  ( Цитата(Сергей Борщ @ May 10 2017, 13:41)  Смотря в каком языке. В плюсах есть, называется перегрузка функций. Это я знаю (см. исходное сообщение). И это ведёт опять к тому-же - или два раза одно и то же тело описывать или вызывать через inline одно общее тело. Вот если-б можно было один раз описать, а для второго списка аргументов использовать что-то типа typedef  typedef Func1 Func2;
|
|
|
|
|
May 10 2017, 12:19
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(jcxz @ May 10 2017, 14:52)  Плохое решение. Две имени (функций) выполняющие одно и то же действие. И придётся каждый раз думать - какое имя подставить. Зато типы возвращаемых значений разные. Поэтому вполне логично, что это должно отражаться в имени функции, то есть где-то там будет const. Меня другое волнует - нельзя взять адрес функции, это же макрос. Но это редко нужно. Цитата(jcxz @ May 10 2017, 14:52)  А как жить тогда? Ведь уже при уровне "Medium" не производится inlining, а при более высоких - отладка практически невозможна.  ( Как жить? Жить и не тужить. Можно подумать, от того, что функция не будет заинлайнена, небо упадёт на землю. Это всё вредные предрассудки, избавляйтесь от них.
|
|
|
|
Сообщений в этой теме
jcxz Возврат значения char */char const * May 10 2017, 10:28  novikovfb Цитата(jcxz @ May 10 2017, 15:52) Вот есл... May 10 2017, 11:56   k155la3 Цитата(novikovfb @ May 10 2017, 14:56) ша... May 10 2017, 14:37  Сергей Борщ QUOTE (jcxz @ May 10 2017, 14:52) А как ж... May 10 2017, 14:14 Сергей Борщ QUOTE (jcxz @ May 10 2017, 13:28) Понятно... May 10 2017, 11:41 Шаманъ Цитата(jcxz @ May 10 2017, 13:28) Имеется... May 10 2017, 18:25 esaulenka Что-то не понял, почему нельзя возвращать указател... May 11 2017, 11:36 demiurg_spb https://gcc.gnu.org/onlinedocs/gcc-4.4.7/gc...r-Bu... May 11 2017, 14:37 jcxz Цитата(esaulenka @ May 11 2017, 13:36) Чт... May 17 2017, 07:09  Сергей Борщ QUOTE (jcxz @ May 17 2017, 10:09) Во-перв... May 17 2017, 11:09   jcxz Цитата(Сергей Борщ @ May 17 2017, 13:09) ... May 17 2017, 11:21    scifi Цитата(jcxz @ May 17 2017, 14:21) Ничего ... May 17 2017, 11:26 krux А вариант с union вам не подойдет ? May 17 2017, 09:44 jcxz Цитата(krux @ May 17 2017, 11:44) А вариа... May 17 2017, 10:25 Arlleex Под рукой нет компилятора, но, на мой взгляд, было... Jan 11 2018, 19:48 jcxz Цитата(Arlleex @ Jan 11 2018, 21:48) Под ... Jan 11 2018, 21:30
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|