Форум программистов, компьютерный форум CyberForum.ru

Как грамотно нтерпретировать ввод нового имени типа, введённого typedef - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
16.04.2011, 14:32     Как грамотно нтерпретировать ввод нового имени типа, введённого typedef #1
Друзья! Дело в том, что вот такой вот код:
C++
1
typedef char  (*char6) [6];
И он значит, что

char6 есть указатель на строку из шести символов.

Это я прочёл в учебнике, то бишь вызубрил, но чуть более сложную конструкцию я сам разобрать не могу. Хотелось бы какой-то общий алгорим прочесть подобно тому, как разбирать сложные объявления функций; благодаря последнему я сам могу кропать "указатель на функцию, возвpащающую указатель на массив из тpёх указателей на функции, возвpащающие значение int"

(Во вложении показано, что я имею ввиду)

Здесь же непонятно как разбирать,интуитивно могу предполагать только, то символам * () [] отводится особая роль, но какая именно сам понять не могу, спасибо кто подскажет.
Вложения
Тип файла: txt slozh_ob.txt (3.3 Кб, 33 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.04.2011, 14:32     Как грамотно нтерпретировать ввод нового имени типа, введённого typedef
Посмотрите здесь:

C++ Определение типа через typedef
C++ Переопределение типа(typedef)
Ввод имени файла с клавиатуры C++
C++ ввод имени пользователя и пароль
C++ Как разрешить ввод только чисел типа int?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.04.2011, 15:59     Как грамотно нтерпретировать ввод нового имени типа, введённого typedef #2
kravam, typedef это конечно хорошо. НО сложные typedef-ы это исключительно головная боль, разобрать-то можно все что угодно. Вопрос зачем такое использовать?
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
16.04.2011, 16:06  [ТС]     Как грамотно нтерпретировать ввод нового имени типа, введённого typedef #3
Сам я не собираюсь использовать подобное, но для разбора ЧУЖИХ кодов. Такой код, например, я взял в одном задачнике.

Короче, разобраться и забыть до поры до времени.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.04.2011, 16:15     Как грамотно нтерпретировать ввод нового имени типа, введённого typedef #4
kravam, мдя, только подробнейшим образом описал алгоритм разбора, и потом всё таки решил заглянуть во вложение (чего обыкновенно не делаю) - и увидел тот же самый алгоритм, который описывал на примере минут 20... Обидно, а самое главное - не понятно, чем он вам не понравился?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.04.2011, 16:31     Как грамотно нтерпретировать ввод нового имени типа, введённого typedef #5
silent_1991, Там алгоритм разбора сложных объявлений функций. А человеку нужен алгоритм разбора typedef-ов.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.04.2011, 16:34     Как грамотно нтерпретировать ввод нового имени типа, введённого typedef #6
ForEveR, а он чем-то отличается? Разбираем так же, а потом говорим, что с помощью char6 можем объявить переменную таким образом:
C++
1
char6 foo;
что эквивалентно
C++
1
char (*foo)[6];
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
16.04.2011, 16:36  [ТС]     Как грамотно нтерпретировать ввод нового имени типа, введённого typedef #7
Откуда же я знал, что тот алгоритм можно применять к typedef?

Я и щас сомневаюсь. Ибо там всё однозначно, разбирается выражение:
C++
1
char  (*char6) [6];
//+++++++++++++++++++++++++++++++++++++++++++++
В моём же случае надо разобрать ДРУГОЕ выражение

C++
1
(*char6) [6];
И вот после того, как его как-то там назвать, идентифицировать, надо вспомнить про
typede char и ляпнуть в конце:
и это всё есть синоним типа char.

Или нет?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.04.2011, 16:43     Как грамотно нтерпретировать ввод нового имени типа, введённого typedef #8
Да почему оно другое?
Ищем идентификатор. Видим char6. Говорим "char6 - это"
Идём вправо. Видим ). Ничего не говорим.
Идём влево. Видим *. Говорим "указатель на".
Идём вправо. Видим [6]. Говорим "массив из 6".
Идём влево. Видим char. Говорим "элементов типа char".
Получаем: "char6 - это указатель на массив из 6 элементов типа char". Затем видим typedef и запоминаем, что для типа (*)[6] можно применять псевдоним char6. Для примера попробуйте:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
typedef char (*char6)[6];
 
int main()
{
    char str[6] = "Hello";
 
    char6 foo1 = &str;
    char (*foo2)[6] = &str;
 
    std::cout << *foo1 << std::endl;
    std::cout << *foo2 << std::endl;
 
    return 0;
}
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
16.04.2011, 16:54  [ТС]     Как грамотно нтерпретировать ввод нового имени типа, введённого typedef #9
Я уже давно убедился, что эти интерпретации СОВПАДАЮТ. Но то, что они ИНОГДА совпадают не основание, чтобы применять их ВСЕГДА.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.04.2011, 16:55     Как грамотно нтерпретировать ввод нового имени типа, введённого typedef #10
kravam, дайте пример, когда они НЕ совпадают.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
16.04.2011, 17:18  [ТС]     Как грамотно нтерпретировать ввод нового имени типа, введённого typedef #11
C++
1
2
char(*p()); 
 typedef char(*g());
Первая строка:
p это функция, которая ничего не принимает и возвращает переменную типа char

Вторая строка (пробуем так же интерпретировать)
g это функция, которая ничего не принимает и возвращает переменную типа char

Получили не имя типа (что хотелось бы, всё таки typedef), а имя функции! Нездоровое что-то. Ну поэтому я и думаю, что должны быть другие правила расшифровки typedef
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.04.2011, 17:24     Как грамотно нтерпретировать ввод нового имени типа, введённого typedef #12
Погодите, а какой тип вы из такого объявления хотите получить-то? Тип функции что-ли?
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
16.04.2011, 17:29  [ТС]     Как грамотно нтерпретировать ввод нового имени типа, введённого typedef #13
Вообще я не силён в этом деле и спросил бы более опытных товарищей, как интерпретировать эту запись? (Да и вообще все остальные, с чего, собсно и начал тему)
C++
1
typedef char(*g());
Если это чушь, тогда почему она компилится?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.04.2011, 17:34     Как грамотно нтерпретировать ввод нового имени типа, введённого typedef #14
Это объявление прототипа функции без параметров, возвращающей указатель на char. И ему пофигу на typedef в начале объявления, функционального типа в сях/плюсах не существует, вы не можете объявить переменную типа функции, максимум - указатель на функцию.

Добавлено через 1 минуту
Хотя нет, тут получается объявление псевдонима типа, который не может быть использован в дальнейшем в объявлении. Потому как при попытке вызова g() мне говорят, что приведение к g не допускается.

Добавлено через 57 секунд
Это чушь, но чушь, соответствующая всем правилам, и потому спокойно проглатываемая компилятором)))
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
16.04.2011, 17:37  [ТС]     Как грамотно нтерпретировать ввод нового имени типа, введённого typedef #15
ОК, я встретил такое в чужом коде, как я должен сие прочесть?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.04.2011, 17:38     Как грамотно нтерпретировать ввод нового имени типа, введённого typedef #16
Единственное, что я смог придумать. Мне дают объявить функцию типа g, но описать её придётся, используя тип явно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typedef char (*g());
 
g a;
 
int main()
{
    a();
 
    return 0;
}
 
char *a()
{
    return NULL;
}
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
25.05.2011, 19:04  [ТС]     Как грамотно нтерпретировать ввод нового имени типа, введённого typedef #17
Никто не знает?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,136
Записей в блоге: 26
25.05.2011, 19:17     Как грамотно нтерпретировать ввод нового имени типа, введённого typedef #18
Общий смысл typedef'а такой, что "typedef <существующий тип> <новый тип>". Когда имеем дело со сложными выражениями, то тут особо мудрить не надо - ищем идентификатор, который обозначает новый тип, выкидываем этот идентификатор и слово typedef. То, что осталось - это и есть "существующий тип". Т.е.

C
1
typedef char  (*char6) [6];
идентификатор нового типа - это char6 (потому что больше ничего не попадает под эту категорию). Выкидываем char6 и typedef, а то, что остаётся

C
1
char  (*) [6];
это и есть новый тип, т.е. указатель на массив из шести char'ов
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
25.05.2011, 19:27  [ТС]     Как грамотно нтерпретировать ввод нового имени типа, введённого typedef #19
C++
1
typedef char(*g());
Это как интерпретировать, скажите пожалуйста?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.05.2011, 19:33     Как грамотно нтерпретировать ввод нового имени типа, введённого typedef
Еще ссылки по теме:

C++ Создание нового типа MPI
Как правильно пользоваться typedef для декларации типа указателя на функцию? C++
C++ Ввод имени файла и текста с консоли

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,136
Записей в блоге: 26
25.05.2011, 19:33     Как грамотно нтерпретировать ввод нового имени типа, введённого typedef #20
Точно так же откидываешь typedef и g и получается "char (*())". Самые внешние скобки можно отбросить (как и п остие #18) и получится "char *()". Т.е. тип функции, возвращающей char*, параметры отсутсвуют. Чтобы лишний пробел не смущал, то переписать это как "char* ()". Но не путать с указателем на функцию, потому как у указателя на функцию скобки вокруг звёздочки ставятся.

C
1
2
typedef char(*g());
g h;
еквивалентно

C
1
char* h();
Yandex
Объявления
25.05.2011, 19:33     Как грамотно нтерпретировать ввод нового имени типа, введённого typedef
Ответ Создать тему
Опции темы

Текущее время: 14:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru