Не понятно что за сообщение, то ли это ман по утилите cdecl(1) толи это ссылка на соглашение о вызове. Ни то ни это не дало разъяснения, может я просто не вижу связи?
Это означает тоже самое, что и без скобок вокруг pf - обычное объявление функции. В случае с указателем на функцию, скобки необходимы для того что бы не путать с объявлением другой функции, возвращающей указатель на int.
Смотри сам, но эта конструкция не зря появилась. А именно из-за неудобства Си-варианта. Да и «рановато» — это ты зря. Уже 14й год идёт к завершению. Скоро выйдет очередной стандарт. А ты прямо как тот несчастный, который сегодня в толксах спрашивал про С89.
Сишные указатели на функции довольно мозголомны и требуют излишней вдумчивости.
если указатели на функции «мозголомны», то не стоит дальше изучать С/C++. лучше сразу перейти к питону/жабе и не мучить свой слабый мозг. может быть, даже подумать о карьере в другой области, не связанной с программированием.
для начинающего программиста как раз очень даже полезно поупражняться с указателями, чтобы раз и навсегда уяснить себе, что это и с чем его едят. чтобы потом не было косяков и (что самое страшное) непонимания.
Ты сумасшедший. Вот чего ты на меня наезжаешь? Я вырос на Си и сталкивался с этой дрянью довольно много. Но как только мне дали в руки более удобный инструмент, так я сразу на него перешёл. А некоторые пусть дальше продолжают корчить из себя суперспецов благодаря умению использовать устаревший и неудобный инструмент. А я вот арифмометром пользоваться умею. И что?
Я вырос на Си и сталкивался с этой дрянью довольно много
самокритично.
я тоже умею. арифмометр у моих родителей до сих пор дома имеется. но только с помощью арифмометра оси и прошивки для чипов не пишут. а Си и ныне там. и никто его не считает «дрянью» или «мозголомной» вещью. вполне себе простой и изящный язык программирования.
Объявление требует скобок вокруг *pf, чтобы обеспечить правильный приоритет операций. Скобки имеют более высокий приоритет, чем операция *, поэтому *pf(int) означает, что pf() — функция, которая возвращает указатель, в то время как (*pf) (int) означает, что pf — указатель на функцию: double (*pf)(int); // pf указывает на функцию, возвращающую double double *pf(int); // pfО — функция, возвращающая указатель на double
test - всего лишь переменная (теперь ссылочная), типа int(&)(int), и принимать она должна соответствующий ей тип;
В случае если мы объявим int(test)(int), т.е. не указатель и не ссылка, то логически остаётся один вариант, это функция, мы определили прототип функции:)
правильно. не надо лезть в дебри, пока твёрдо не усвоишь основы.
не надо скакать по верхам. должно быть понимание того, что и как работает в языке. С++ много унаследовал от С и вопрос про указатели - это не С++, это основы С. так что лучше сначала вообще изучить С, а потом уже переходить к С++. и больше эспериментируй с кодом: практика даёт гораздо больше, чем просто чтение учебников.
Ребят, остановитесь, я не спрашивал вас об опыте разработки и программирования в общем, я спрашивал вас о конкретной конструкции конкретного языка, ответили, достаточно. Только дай волю, сразу каждый горазд мастера ёду изображать, и холивары чинить. Смотрю тут и новички в бой лезут :))))
не было никакой мысли учинять холивар, чесслово. просто полезный совет.
«новичком» меня называть можно с большой условностью. я начала программировать на С ещё в детстве, в 1989 году. с тех пор я кое-чему научилась.
я просто видела довольно много разных программистов и мне часто приходилось исправлять косяки за другими людьми и тыкать их носом в баги. и проблема с непониманием сишных указателей - одна из основных проблем. встречаются даже «опытные» программисты, которые просидели на своём месте по десять лет и так и не поняли, что такое указатели и как с ними работать. что какбэ есть полный бардак. поэтому я всегда пытаюсь донести до людей важность понимания основ. чтобы потом «программисты на Qt» и прочие фрукты не задавали фейспалмовых вопросов на форумах. у меня это не вызывает никакого баттхёрта, но эти люди потом пишут код. и это страшно.
Не-а, там в родном коде нет Ptr, а в FFI - для функций FunPtr (ну и :: в сигнатуре). Просто альтернативная нотация, по мотивам. Хотя может где-то такая и есть.
Если ты её не понимаешь - это не значит, что она кривая
Если ты не понимаешь, понимаю ли я или нет - это не значит, что не понимаю, что она кривая.
Объяснить хоть осилишь?
Не надо зигзагом изнутри-внутрь читать. Более «консистентая»: если такой тип аргументом, то в сигнатуре си (без typedef само собой) нужно имя функции. А здесь просто справа добавится стрелочка. Так что «обтекай, лалка» (c).
чем же всётаки конкретно нотация в сях кривущая?
1) Сигнатура к именам сильно привязана; 2) * - «обратный порядок» (читается как «после разыменования получим такой-то тип»); 3) Практика показывает, что есть более удачная нотации, хотя допускаю, что твой насест недостаточно высок, чтобы это увидеть.
(сорри за оффтоп)
ну, какбэ биологически я - женщина. и тут ничего не поделать. :)
хотя, вопрос пола меня меньше всего волнует, если честно. это не мешает мне быть математиком, программистом, разработчиком железа, играть на басу и контрабасе и держать дома пауков и огромную игуану. у каждого свои интересы, никто же не запрещает. я веду холостяцкий образ жизни, хорошо зарабатываю и полностью себя обеспечиваю. вполне довольна и никого не напрягаю.
что касается форума: я фанат-люнюксоид, у меня за плечами дофига лет в программировании и в разработке железа, причём недеццкой такой разработке. ну и плюс программирование ради развлечения, в свободное от работы время. так что мне есть что сообщить по теме С или С++.
Мне сложно поверить что под этим аккаунтом скрывается действительно женщина, и что она действительно может иметь такой склад ума. И к тому же все знают «на лоре нет женщин» )).
castFunPtrToPtr есть (или как-то так), так что формально возможна.
Дык, наверное низкоуровневая операция и отвественность на программисте, что никакие инварианты там не нарушит. Все равно не совсем понимаю, как (для родного кода, т.е. экспорт, а потом импорт не считается) получить:
class isOdd
{
public:
bool fun(int x)
{
return x % 2;
}
};
bool (isOdd::*PointerToSomeFun)(int x) = &isOdd::fun;
Я имею ввиду что pointer на fun мы указываем описывая полностью функцию и указываем звездочку непосредственно перед обявляемым указателем что в принципи логично, а вот символ взятия адреса ставим перед названием класса. Не могу понять логику этих плюсов.