Не знаю как в С, в С++ есть понятие point of declaration
3.3.1 Point of declaration
1 The point of declaration for a name is immediately after its complete declarator (clause 8) and before its
initializer (if any), except as noted below.
Т.е., как мне кажется (хотя это все гадание на кофейной гуще) ты пытаешься использовать имя до его point of declaration и потому комо и г++ воспринимают его как инициализатор (нелегальный)
Of course, the code must be complete enough to compile and link.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Не знаю как в С, в С++ есть понятие point of declaration L_L>
L_L>3.3.1 Point of declaration
L_L>1 The point of declaration for a name is immediately after its complete declarator (clause 8) and before its
L_L>initializer (if any), except as noted below.
L_L>Т.е., как мне кажется (хотя это все гадание на кофейной гуще) ты пытаешься использовать имя до его point of declaration и потому комо и г++ воспринимают его как инициализатор (нелегальный)
Приведу другую аналогию — Структура может иметь ссылку на саму себя, в случае с функциями такая аналогия работает не везде, вот и интересно мне кто не прав...
rol>Приведу другую аналогию — Структура может иметь ссылку на саму себя, в случае с функциями такая аналогия работает не везде, вот и интересно мне кто не прав...
Деклараторы у структуры и функции несколько разные
Of course, the code must be complete enough to compile and link.
Здравствуйте, rol, Вы писали:
rol>Доброе время суток
rol>Вопрос в том, возможен ли сабж по стандарту С99.
Где-то я видел похожий pattern…
Вот. Пророк Саттер, More Exceptional C++:
Item 32. Recursive Declarations
Difficulty: 6
Can you write a function that returns a pointer to itself? If so, why would you want to?
What is a pointer to function? How can it be used?
Assume it is possible to write a function that can return a pointer to itself. That function could equally well return a pointer to any function with the same signature as itself. When might this be useful? Explain.
Is it possible to write a function f() that returns a pointer to itself? It should be usable in the following natural way:
// Example 32-3
//
// FuncPtr is a typedef for a pointer to a
// function with the same signature as f()
//
FuncPtr p = f(); // executes f()
(*p)(); // executes f()
If it is possible, demonstrate how. If it is not possible, explain why.
Solution
Yes, it's possible, but it's not obvious.
For example, one might first try using a typedef directly, writing code that looks something like this:
A Correct and Portable Way
Fortunately, we can get exactly the intended effect required by Question #3 in a completely type-safe and portable way, without relying on nonstandard code or type-unsafe casting. The way to do it is to add a level of indirection in the form of a proxy class that takes, and has an implicit conversion to, the desired pointer type.
// Example 32-3(d): A correct solution
//class FuncPtr_;
typedef FuncPtr_ (*FuncPtr)();
class FuncPtr_
{
public:
FuncPtr_( FuncPtr p ) : p_( p ) { }
operator FuncPtr() { return p_; }
private:
FuncPtr p_;
};
Здравствуйте, Centaur, Вы писали:
C>Здравствуйте, rol, Вы писали:
rol>>Доброе время суток
rol>>Вопрос в том, возможен ли сабж по стандарту С99.
C>Где-то я видел похожий pattern…
C>Вот. Пророк Саттер, More Exceptional C++: C>[q]Item 32. Recursive Declarations C>Difficulty: 6
Тут рассматривается другая проблема — возврат функцией указателя на саму себя, а мне надо чтобы функция принимала параметром указатель на саму себя.
Зачем?... не спрашивайте — это теоретическое исследование
Здравствуйте, rol, Вы писали:
rol>Тут рассматривается другая проблема — возврат функцией указателя на саму себя, а мне надо чтобы функция принимала параметром указатель на саму себя.
Казалось бы... а в чём принципиальная разница?
class Fun;
typedef int (*fun_type) (int, Fun);
class Fun
{
fun_type f_;
public:
/*implicit*/Fun(fun_type f) : f_(f) {}
fun_type get() const { return f_; }
// даже не знаю, что здесь более полезноint operator()(int x, Fun f) const { return f_(x,f); }
operator fun_type() const { return f_; }
};
rol>Зачем?... не спрашивайте — это теоретическое исследование
Здравствуйте, rol, Вы писали:
rol>Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>>Не знаю как в С, в С++ есть понятие point of declaration L_L>>
L_L>>3.3.1 Point of declaration
L_L>>1 The point of declaration for a name is immediately after its complete declarator (clause 8) and before its
L_L>>initializer (if any), except as noted below.
L_L>>Т.е., как мне кажется (хотя это все гадание на кофейной гуще) ты пытаешься использовать имя до его point of declaration и потому комо и г++ воспринимают его как инициализатор (нелегальный)
rol>Приведу другую аналогию — Структура может иметь ссылку на саму себя, в случае с функциями такая аналогия работает не везде, вот и интересно мне кто не прав...
typedef int (*tpfn)(void*);
typedef int (*ftpfn)(tpfn);
Здравствуйте, rol, Вы писали:
rol>Доброе время суток
rol>Вопрос в том, возможен ли сабж по стандарту С99.
rol>Семерка компилит без ворнингов и все пашет ОК, Comeau не компилит, gcc — warning
rol>Спасибо
а где это в семёрке компилится?
или всё же в билдере
Здравствуйте, rol, Вы писали:
К>>А всё-таки? Делаешь Y-комбинатор?
rol>Да нет, вообще сейчас в Сях сижу, нечаянно наткнулся, решил разобраться...
Если в голых сях, то можешь воспользоваться тем фактом, что все указатели на функции можно приводить к void(*)() и обратно. Небезопасно, конечно... ну да ничего не поделаешь.