K & R 2E Typedef pg 146,147 - PullRequest
1 голос
/ 23 июля 2011
typedef struct tnode { ... } Treenode;

Поскольку typedef не может создать для нас новый тип, является ли это частью объявления "struct tnode"? Итак, в вышеприведенном, это создает typedef "Treenode" И объявляет "struct tnode"?

return (Treeptr) malloc(sizeof(Treenode));

Здесь, поскольку Treenode является синонимом для всего объявления "struct tnode", необходимо ли передать всю декларацию sizeof или можно просто сделать: sizeof (struct tnode) после объявления tnode в другом месте через struct tnode {.. .};

typedef struct tnode *Treeptr;

Typedef - это: typedef old-существующие-type newtype; Итак, здесь .. struct tnode * - это старый тип, который уже должен существовать (должен быть объявлен в другом месте), а Treeptr является синонимом этого ... но почему мы не можем разместить это в пустом месте ?? Примерно так: typedef struct tnode * Treeptr;

typedef int (*PFI)(char *, char *);

Что здесь происходит? старый тип int и (* PFI) (char , char ) является синонимом для int ?? Если int (* PFI) (char *, char *) старого типа, что нового? Что он имеет в виду, говоря: «В сущности, typedef похож на #define, за исключением того, что, поскольку он интерпретируется компилятором, он может справляться с текстовыми подстановками, выходящими за пределы возможностей препроцессора»? В упомянутом примере .. почему препроцессор не может делать то, что делается ??

1 Ответ

4 голосов
/ 23 июля 2011

Итак, в приведенном выше примере это создание typedef "Treenode" и объявление "struct tnode"?

Да, в одном предложении есть и объявление, и определение типа.

но почему мы не можем расставить вещи? Примерно так: typedef struct tnode * Treeptr

Если вы говорите о * - можете. в любом случае это отдельный токен.

typedef int (*PFI)(char *, char *);

Это определение типа функции;

typedef int (*PFI)(char *, char *);
^ define a type called
              ^PFI as:
             ^ pointer
                  ^to function
                   ^that receives two char pointers as arguments
        ^ and returns an int

Теперь вы можете использовать PFI вместо int (*)(char *, char *) (при использовании в качестве параметра / переменной)

EDIT:

Пример кода для использования указателя функции:

#include <stdio.h>

int add(int a, int b) { return a + b; }

typedef int (*pfi)(int,int);

int main()
{
    pfi my_func = add;
    int res;
    res = (*my_func)(1,2);
    printf( "add(1,2)=%d", res);
    return res;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...