2013-09-05 4 views
4

Я хочу объявить тип указателя, которые указывают на функции, поэтому я стараюсь:ЬурейеЕ тип указателя функции

typedef void (*print)(void); отлично работает

void (*print)(void); р является переменной ponter, а не тип.

typedef (void) (*print)(void); ошибки Ожидается идентификатор или '(' перед 'пустота'

typedef void (*)(void) Print;

ошибка: ожидается, '=', '', ';', 'ASM' или «_ атрибут _ . 'перед 'Print'

Мой вопрос:

  1. у меня есть использовать typedef, чтобы объявить тип указателя функции?

  2. Почему typedef (void) (*print)(void); неправ? что означает ()?

  3. Почему я не могу написать таким образом: typedef void (*)(void) Print?

+0

Вам не нужно typedef, чтобы объявить символ указателя функции. – mawia

+0

Как это сделать? отправьте идею, пожалуйста. –

+2

На все ваши вопросы можно в значительной степени ответить «потому что разработчики языка решили это так» –

ответ

11

Правильный путь:

typedef void (*print_function_ptr)(void) 

и его использование для переменной/Объявление параметра:

print_function_ptr p; 
  1. Вам не нужно ЬурейеЕ объявить переменную , Вы можете напрямую написать void (*p)(void), чтобы объявить переменную p, указывая на функцию, принимающую void и возвращающую void. Однако, чтобы объявить псевдоним/имя типа для указателя на функцию, typedef является инструментом.

  2. Это не значит, что это не допустимый синтаксис Си.

  3. Потому что это не так, как работает C. Typedefs в C имитирует, как переменные объявлены или определены.

+0

Надеюсь, объявить тип указателя функции, а не переменную, есть ли способ сделать это без typedef? –

+0

@LidongGuo: что вы подразумеваете под объявлением типа указателя функции? Вы можете объявить объект, который имеет тип «указатель на функцию», не используя «typedef». Нет другого способа, кроме использования 'typedef' для создания имени типа, которое вы можете использовать впоследствии. –

+0

Надеюсь объявить тип типа имени структуры, затем я могу использовать его, объявив много указателей на функцию ' –

3
  1. Нет, вы не должны использовать typedef, чтобы создать объект типа «указатель на функцию»:

    void somefunc(void (*pointer)(void)) 
    { 
        (*pointer)(); 
        pointer(); 
    } 
    

    Однако, нет никакого способа, чтобы создать имя для другого типа, кроме использования typedef. Я полагаю, вы могли бы заниматься в макро-повозка, запряженная волами, чтобы сгенерировать «указатель на функцию», но после того, как макрос расширяется, вы бы иметь «указатель на функцию» выписал:

    #define PTR_FUNC(func) void (*func)(void) 
    void somefunc(PTR_FUNC(pointer)) { ... } 
    
  2. (void) нотации как имя типа неверно. Вы не пишете: (int) x; и ожидаете объявить переменную x - это тип.То же самое с обозначениями, которые вы используете в своем typedef.

  3. Вы не можете написать typedef void (*)(void) Print;, потому что это не разрешенный синтаксис Си. Вы также не можете написать typedef [32] int name; - это недопустимый синтаксис Си.

Смежные вопросы