Определение типа функции (НЕ указатель на функцию) - PullRequest
4 голосов
/ 19 февраля 2010
typedef void int_void(int);

int_void - это функция, принимающая целое число и ничего не возвращающая.

Мой вопрос: можно ли использовать его "один", без указателя? То есть можно ли использовать его просто как int_void, а не int_void*?

typedef void int_void(int);
int_void test;

Этот код компилируется. Но может ли test быть как-то использован или назначен чему-то (без приведения)?


/* Even this does not work (error: assignment of function) */
typedef void int_void(int);
int_void test, test2;
test = test2;

Ответы [ 6 ]

7 голосов
/ 19 февраля 2010

В результате получается более короткое объявление для функций.

Вы можете вызвать test, но вам понадобится фактическая функция test().

Вы не можете ничего назначитьtest, потому что это метка, по сути постоянное значение.

Вы также можете использовать int_void для определения указателя функции, как показывает Нил.


Пример

typedef void int_void(int);

int main()
{
    int_void test; /* Forward declaration of test, equivalent to:
                    * void test(int); */
    test(5);
}

void test(int abc)
{
}
3 голосов
/ 19 февраля 2010

Вы не объявляете переменную; вы делаете предварительное объявление функции.

typedef void int_void(int);
int_void test;

эквивалентно

void test(int);
2 голосов
/ 19 февраля 2010

Может использоваться в следующих случаях (вне моей головы):

  • универсальный код:

    boost :: functionfunc;

  • другие определения типов:

    typedef int_void * int_void_ptr;

  • объявления:

    void add_callback(int_void * callback);

Могут быть и другие.

1 голос
/ 19 февраля 2010

Я думаю, что это законно - следующее демонстрирует его использование:

typedef void f(int);

void t( int a ) {
}

int main() {
    f * p = t;
    p(1); // call t(1)
}

и на самом деле этот код C ++ компилируется (с g ++) и запускается - хотя я действительно не уверен, насколько он кошерный.

#include <stdio.h>

typedef void f(int);

void t( int a ) {
    printf( "val is %d\n", a );
}

int main() {
    f & p = t;   // note reference not pointer
    p(1);
}
0 голосов
/ 19 февраля 2010

Это должно работать, кастинг не требуется:

void f(int x) { printf("%d\n", x); }

int main(int argc, const char ** argv)
{
    typedef void (*int_void)(int);
    int_void test = f;
    ...
 }

Имя функции «превращается» в указатель на функцию всякий раз, когда вы используете имя функции в чем-то отличном от вызова функции. Если is присваивается функциональному ptr того же типа, вам не требуется приведение.

Оригинал

typedef int_void(int);

само по себе бесполезно, без использования указателя на тип. Таким образом, ответ на ваш вопрос «нет, вы не можете использовать этот typedef без указателя».

0 голосов
/ 19 февраля 2010

Указатели на функции являются значениями в C / C ++.Функции не.

...