anonymous@RULINUX.NET~# Last login: 2024-03-28 13:35:36
Регистрация Вход Новости | Разметка | Пользователи | Галерея | Форум | Статьи | Неподтвержденное | Трекер | Правила форума | F.A.Q. | Ссылки | Поиск
[#] [Добавить метку] [Редактировать]
Скрыть

C++, зогатка.

cpp
#include
typedef int (*f_ptr)(const int x, const int y);
// error: uninitialized const member `::f'
//struct {
//    const char * s;
//    const f_ptr f;
//} test00 = { };
struct {
    const char * s;
    f_ptr f; // non-const, OK too.
} test0 = { };
struct {
    const char * s;
    const f_ptr f;
} test1 = { "lol", NULL}; // OK
struct {
    const char * s;
    const f_ptr * f; // double ptr apparently.
} test2 = { }; // OK
struct {
    const char * s;
    const f_ptr ** f; // triple ptr?
} test3 = { }; // OK

int main(void)
{
    int x = 0;
//    x += (&(test0.f))(0, 0); // error: `(((int (**)(int, int))(&test0)) + 4u)' cannot be used as a function
    x += test0.f(0, 0);
    x += (*(test0.f))(0, 0);
    x += (**(test0.f))(0, 0);
    x += (***(test0.f))(0, 0);

//    x += (&(test1.f))(0, 0); // error: `(((int (* const*)(int, int))(&test1)) + 4u)' cannot be used as a function
    x += test1.f(0, 0);
    x += (*(test1.f))(0, 0);
    x += (**(test1.f))(0, 0);
    x += (***(test1.f))(0, 0);
//    x += (&(test2.f))(0, 0); // error: `(((int (* const**)(int, int))(&test2)) + 4u)' cannot be used as a function
//    x += test2.f(0, 0); // error: `test2.::f' cannot be used as a function
    x += (*(test2.f))(0, 0);
    x += (**(test2.f))(0, 0);
    x += (***(test2.f))(0, 0);
//    x += (&(test3.f))(0, 0); // error: `(((int (* const***)(int, int))(&test3)) + 4u)' cannot be used as a function
//    x += test3.f(0, 0); // error: test3.::f' cannot be used as a function
//    x += (*(test3.f))(0, 0); //  `*test3.::f' cannot be used as a function
    x += (**(test3.f))(0, 0);
    x += (***(test3.f))(0, 0);
    return x;
}
 
Суть зогатки: меня не очень удивляет, что указатели на функции можно бесконечно дереференсить и они по-прежнему остаются как бы функциями.

Но меня дико удивляет, почему простой указатель на функцию отказывается дефолт-инициализироваться (если я правильно понимаю, гарантированно в NULL). Причём только если он ещё и const.

Проверял в gcc 3.4.6, 4.2.2.

anonymous(*) (2011-01-08 12:01:00)

Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.6.30 Version/10.63

[Ответить на это сообщение]
[#] [Добавить метку] [Редактировать] Ответ на: C++, зогатка. от anonymous 2011-01-08 12:01:00
avatar
Скрыть

Re: C++, зогатка.

нмхренашегьки не работает у вас дижок форума

anonymous(*)(2011-01-08 12:02:12)

Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.6.30 Version/10.63
[#] [Добавить метку] [Редактировать] Ответ на: Re: C++, зогатка. от anonymous 2011-01-08 12:02:12
avatar
Скрыть

Re: C++, зогатка.

ты страничку с разметкой читал? не begin[c] а begin[cpp]{highlight}

Tux-oid(*)(2011-01-08 12:15:48)

Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Этот тред читают 1 пользователь:
Анонимных: 1
Зарегистрированных: 0




(c) 2010-2020 LOR-NG Developers Group
Powered by TimeMachine

Valid HTML 4.01 Transitional Правильный CSS!