Podstawowa składnia operandu typedef

Podane:

typedef type-declaration synonym;

Widzę jak:

typedef long unsigned int size_t;

Deklaruje size_t jako synonim long unsigned int, jednak (Wiem, że tak, ale) nie widzę dokładnie Jak:

typedef int (*F)(size_t, size_t);

Deklaruje F jako synonim pointer to function (size_t, size_t) returning int

Dwa operandy Typedefa (type-declaration, synonym) w pierwszym przykładzie to long unsigned int i size_t.

Jakie są dwa argumenty do typedef w deklaracji F lub są może przeciążone wersje typedef?

Jeśli istnieje istotne rozróżnienie między C A C++ proszę o rozwinięcie inaczej interesuje mnie przede wszystkim C++ jeśli to pomoże.

 16
Author: Peter McG, 2010-09-24

5 answers

Deklaracje typu używając typedef są takie same jak odpowiadające im deklaracje zmiennych, tylko z typedef poprzedzone. Więc

        int x; // declares a variable named 'x' of type 'int'
typedef int x; // declares a type named 'x' that is 'int'

Jest dokładnie tak samo z typami wskaźników funkcji:

        int(*F)(size_t); // declares a variable named F of type 'int(*)(size_t)'
typedef int(*F)(size_t); // declares a type named 'F' that is 'int(*)(size_t)'

To nie jest "przypadek szczególny"; tak właśnie wygląda typ wskaźnika funkcji.

 31
Author: James McNellis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-23 23:58:36

To nie jest formalna składnia typedef, to tylko jeden z wzorców, które może przyjąć. W standardzie C 6.7.1, typedef jest zdefiniowany składniowo jako specyfikator klasy storage (jak extern lub static). Modyfikuje deklarację, tak że deklaracja deklaruje Alias typu zamiast obiektu.

typedef nie jest ani funkcją, ani operatorem, więc pojęcia "argument", "operand" lub "przeciążenie" nie mają do niej zastosowania. Po prostu mówi kompilatorowi, jakiego rodzaju deklaracją jesteś Robienie.

W C++, typedef jest składniowo zdefiniowany jakoDecl-specifier , nie jest tostorage-class-specifier . storage-class-specifiiers są również Decl-specifiiers, podobnie jak friend. Nie sądzę, aby to miało jakąś praktyczną różnicę, to inny sposób na powiedzenie tego samego, co mówi C, ale jest to 7.1 standardu C++, jeśli chcesz sam spojrzeć. Przyznaję, że na razie mnie to dziwi.

 7
Author: Steve Jessop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-23 23:02:11

Twoje początkowe założenie o składni typedef posiadającej

typedef type-declaration synonym;

Struktura jest absolutnie Niepoprawna. Składnia Typedef nie ma takiej struktury i nigdy nie miała.

Składnia Typedef jest składnią zwykłej deklaracji, tak jak każda inna deklaracja w języku C. Słowo kluczowe typedef jest po prostu specyfikatorem deklaracji, który wskazuje, że zadeklarowana nazwa jest nazwą typedef, a nie zmienną, oznacznikiem funkcji lub czymś innym.

Możesz użyć wielu deklaratorów w ta sama deklaracja typedef, na przykład

typedef int TInt, *TIntPtr, (*TIntFuncPtr)(void), TIntArr10[10];
 2
Author: AnT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-23 23:04:40

Zamiast myśleć o typedef jako operacji, która przyjmuje dwa parametry (typ i synonim), pomyśl o niej jako o kwalifikatorze typu. Aby zadeklarować zmienną o nazwie F, która była wskaźnikiem funkcji przyjmującym dwa parametry size_t i zwracającym int, wystarczy:

int (*F)(size_t, size_t);

Dodaj kwalifikator type typedef i zamiast deklarować zmienną, zadeklarowałeś alias type.

 1
Author: llasram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-23 22:48:20

typedef używa składni deklaracji.

Wskaźnik funkcji typedef jest taki sam jak używany do deklarowania wskaźnika funkcji. Z wyjątkiem tego, że deklarujesz typ, a nie zmienną.

 0
Author: linuxuser27,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-23 22:46:05