2010-02-07 18 views
18

Perché typedef non può essere utilizzato con statico? Ad esempio, il codice riportato di seguito è un errorePerché typedef non può essere utilizzato con statico?

typedef static int INT2; 

Quali altre regole devono essere seguite per utilizzare il typedef? Quali altre parole chiave non possono essere utilizzate con typedef?

Grazie mille!

+8

Sia typedef e statico sono classi di memoria nella lingua (rigorosamente vero per C, io credo che sia vero anche per C++). Puoi avere una sola classe di archiviazione in una singola dichiarazione: ne hai due nel tuo esempio, da qui l'errore. –

+3

+1. "L'identificatore typedef è chiamato '' identificatore della classe di memoria '' solo per comodità sintattica;" – dirkgently

risposta

31

typedef non dichiara un esempio di una variabile, si dichiara un tipo (tipo alias in realtà),

static è un qualificatore si applica a un'istanza, non un tipo, in modo da poter utilizzare statica quando si usa utilizzare il tipo, ma non quando si definisce il tipo. Ti piace questa ..

typedef int int32; 
static int32 foo; 
+3

'static' non è un qualificatore, ma un * identificatore della classe di memoria *. Pertanto, non è "parte del tipo" come qualificatori come 'const', ad es. 'typedef const int ci; ci x = 42; '(i tipi con qualificatori diversi sono ancora gli stessi tipi, ma potrebbero non essere compatibili). – dyp

+0

@John Knoeller Elegante! Una grande risposta! – Sohaib

20

La parola chiave static non fa parte del tipo, a seconda del contesto è un identificatore di archiviazione o di ambito e non ha alcuna influenza sul tipo. Pertanto, non può essere utilizzato come parte della definizione del tipo, motivo per cui non è valido qui.

Un typedef è una definizione di tipo, ovvero stai dicendo che "questo nome" ora si riferisce a "questo tipo", il nome che devi fornire deve essere un identificatore come definito dallo standard di lingua, il tipo deve essere un tipo specificatore, cioè un tipo già nominato, sia di tipo base o typedef'd, uno struct, union, class o enum specificatore, con possibili qualificatori di tipo, cioè const, o volatile.

La parola chiave statica tuttavia non modifica il tipo, dice qualcosa sull'oggetto, (in generale, non nel senso OOP). Ad es. è la variabile che viene inserita nella memoria statica, non nel tipo.

Sembra che si sta cercando di usare un typedef come macro, vale a dire

#define MYINT static int 
+1

Perché è significativo? –

+0

@il fan di Douglas Adams: penso di sì; forse non così chiaramente come la risposta di Bailey. Gli specificatori di memoria e gli specificatori di ambito non sono parti del * tipo * di qualcosa; sono parti di come le istanze del tipo sono archiviate o con scope. –

+0

@Robert bene, come dice la parola chiave, è una defizione di tipo, dato che statico non fa parte del tipo, se non può essere usato nella definizione di un tipo. – wich

7

Durata di stoccaggio è associato con gli oggetti. Una dichiarazione typedef crea un alias - un nuovo nome per un tipo. Non crea oggetti. Quindi non è possibile utilizzare uno specificatore di archiviazione con typedef.

3

Credo che le risposte da wich e Bailey sono corrette e sufficienti, ma per contribuire a chiarire a quelle che ha commentato: Quando si dichiara una typedef il tipo risultante deve essere coerente in tutto il mondo può essere utilizzato. Cosa succede se il typedef si è creato appare nel seguente codice:

INT2 myfunction() 
{ 
    return 0; 
} 

class MyClass 
{ 
    public: INT2 x; 
}; 

INT2 MyClass::x; 
  • La funzione che restituisce INT2 non avrebbe alcun senso. Ovviamente il valore restituito non è statico (non può essere).
  • La dichiarazione dei membri x in MyClass sarebbe statica e anche la sua successiva definizione? Questo non è solo ridondante, è errato, perché non si usa la parola chiave statica quando si definisce un membro statico - solo quando lo si dichiara.

Lo stesso vale per le altre parole chiave menzionate da Bailey. Pensaci: le uniche parole chiave che possono dichiarare coerentemente un tipo per tutti i suoi usi sono i tipi primitivi stessi e i modificatori di tipo (const, unsigned, ecc.).

3

Come molti altri hanno menzionato, static è un identificatore di classe di memoria, non un tipo.Ciò che significa, in particolare, è che la parola chiave static dice al compilatore qualcosa su dove posizionare una variabile, se debba o meno apparire come un simbolo per il collegamento esterno, o per quanto tempo la variabile dovrebbe rimanere in esistenza.

Un tipo è un'interpretazione di una posizione di memoria. È una descrizione del tipo di dati che vivono in quella posizione e viene associato a un insieme di operazioni che possono essere eseguite su tali dati.

Quindi il tipo e la classe di archiviazione sono correlati solo in quanto entrambi dicono qualcosa su un dato. La parola chiave typedef serve per creare nuovi nomi per i tipi.

Per quanto riguarda un'analogia casuale ...

Un tipo è come parlare di una specifica marca e modello di auto.

Una classe di stoccaggio è come dire che un'automobile è immagazzinata in un garage privato riscaldato e utilizzata solo su un circuito privato.

Un typedef è un soprannome per una marca e un modello specifici.

2

typedef non può essere utilizzato insieme a static sia come typedef e static sono classi di memoria. Se si definisce una variabile come typedef static int a;, esistono più classi di memoria per la variabile a.

Le classi di archiviazione vengono utilizzate per definire l'ambito (visibilità) e la durata di vita di variabili e/o funzioni. Alcuni esempi sono static, auto, register, extern, typedef ecc

+0

Questo è interessante! Infatti, 'typedef' è specificato come * identificatore della classe di memoria *, sebbene" solo per comodità sintattica "6.7.1/3. – dyp

+0

Jonathan Leffler ha detto la stessa cosa in un [commento all'OP] (http://stackoverflow.com/questions/2218435/why-typedef-can-non-be-used-with-static#comment2172109_2218435). – dyp

Problemi correlati