4 / 4 / 3
Регистрация: 13.07.2014
Сообщений: 129
1

Нюансы синтаксиса: что означает запись typedef void(*PF) (); ?

17.10.2015, 20:58. Показов 4303. Ответов 5
Метки нет (Все метки)

Что означает эта команда

C++
1
typedef void(*PF) ();
?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.10.2015, 20:58
Ответы с готовыми решениями:

Нюансы синтаксиса: что означает запись void Test::TestCheck() ?
Вот пример, и мне не понятно почему мы пишем сначала void перед пространством имени ??? Почему...

Нюансы синтаксиса: что означает запись typedef long long i64 ?
Что означает эта строчка? typedef long long i64; Как я понял, функция typedef позволяет...

Нюансы синтаксиса: что означает void, while и switch?
1)void answer Yes() 2)while (label) 3)switch (1 + rand() % 4) Что означают эти команды...

Нюансы синтаксиса: что означает запись (1<<20) ?
Добрый день! Подскажите, пожалуйста. Нашел программу, в ней есть такая строка: #define...

5
2830 / 1639 / 253
Регистрация: 03.12.2007
Сообщений: 4,222
17.10.2015, 21:04 2
http://cdecl.org/
declare PF as pointer to function returning void
1
Эксперт С++
8719 / 4262 / 950
Регистрация: 15.11.2014
Сообщений: 9,669
17.10.2015, 21:07 3
Лучший ответ Сообщение было отмечено DrOffset как решение

Решение

Цитата Сообщение от Andrey040601 Посмотреть сообщение
typedef void(*PF) ();
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
void foo(){ std::cout<<"foo\n"; }  //<--- это - обычная функция
 
typedef void(*PF) (); //<--- это объявления типа "указатель на обычную функцию"
 
int main()
{
    PF pf = &foo; //<--- это создание указателя на функцию, 
     //который смотрит на функцию foo
 
   pf(); //<--- а это запуск функции по указателю
 
}
3
4 / 4 / 3
Регистрация: 13.07.2014
Сообщений: 129
18.10.2015, 13:57  [ТС] 4
Спасибо!
0
Эксперт CЭксперт С++
5084 / 2269 / 332
Регистрация: 20.02.2013
Сообщений: 5,598
Записей в блоге: 19
18.10.2015, 16:43 5
Цитата Сообщение от hoggy Посмотреть сообщение
pf(); //<--- а это запуск функции по указателю
Хых, сразу вспомнилось:
Цитата Сообщение от Стивен Прата
О, великий синтаксис! Как pf и (*pf) могут быть эквивалентными? Сторонники одной школы
утверждают, что поскольку pf — указатель на функцию, то *pf — функция, поэтому вы
должны использовать для ее вызова (*pf) (). Сторонники другой школы придерживаются
мнения, что поскольку имя функции является указателем на эту функцию, то и любой указа-
тель на функцию должен вести себя как имя функции; отсюда вызов функции через указа-
тель следует записывать как pf (). Язык C++ придерживается компромиссной точки зрения
о том, что обе формы корректны, или, по крайней мере, допустимы, даже несмотря на то,
что они логически несовместимы. Прежде чем вы отвергнете компромисс и выберете для
себя одну форму, вспомните, что допущение несогласованных и логически несовместимых
представлений вполне присуще человеческому мышлению.
0
Эксперт С++
8719 / 4262 / 950
Регистрация: 15.11.2014
Сообщений: 9,669
18.10.2015, 22:44 6
Цитата Сообщение от gru74ik Посмотреть сообщение
Сторонники одной школы
утверждают, что поскольку pf — указатель на функцию, то *pf — функция
это справедливо исключительно для языка си, но не для с++.
потому что на с++ *pf дает ссылку-на-функцию, а не функцию-по-значению.
а вот в сишке ссылок нет, потому там без вариантов.

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

так же и с функциями: функции умеют неявно каститься к указателю на функцию.
но это не значит, что это одно и тоже.

Цитата Сообщение от gru74ik Посмотреть сообщение
Язык C++ придерживается компромиссной точки зрения
нет, не придерживается.
язык с++ унаследовал типично сишное раздолбайство,
поимев его как легаси из соображений обратной совместимости.

однако функция на языке с++ каститься либо к указателю на функцию,
либо к ссылке на функцию.

это уже как вам захочется.
вот только ссылки - продукт с++ не отягощенный сишным легаси.
они никогда не кастятся к указателям.

поэтому, поимев ссылку на функцию,
неявно привести её к указателю на функцию уже не получится.

и да - как я уже писал выше,
неявный каст свободных функций к указателю - это чисто сишная тема.

для указателей-на-функцию-член не распространяется.
слава богу сишка не умеет функции-члены,
поэтому раздолбайное легаси не затронуло функции-члены.
для них всегда приходится явно указывать указатель:

C++
1
2
auto* ptr  = &some::method; // можно
auto* ptr  = some::method; // нельзя. это - с++, а не сишка
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.10.2015, 22:44
Помогаю со студенческими работами здесь

Нюансы синтаксиса: что означает запись for ( ; ; ) ?
Встретила в программе такую строку: for ( ; ; ) { // some code } Кто может объяснить...

Нюансы синтаксиса: что означает запись amount++ ?
что означает amount++

Нюансы синтаксиса: что означает данная запись
Всем привет! VS2010, консольный проект C++. По ошибке написал: int b = (5, 4, 11, 56, 18, 0);...

Нюансы синтаксиса: что означает запись sum += x; ?
что это за сокращение?


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru