2014-11-26 9 views
13

Wie in diesem Beispiel (in C):Mit sizeof auf einem typedef statt einer lokalen Variablen

typedef int type; 

int main() 
{ 
    char type; 
    printf("sizeof(type) == %zu\n", sizeof(type)); // Outputs 1 
} 

Der Ausgang ist immer die Größe der lokalen Variablen type.

Wenn C++ die Notwendigkeit entfernt struct vor jedem Gebrauch einer Struktur zu schreiben, es immer noch die erhaltenen struct {type} Syntax und stellte einen Alias ​​(class {type}) explizit auf eine Struktur oder eine Klasse zu beziehen.

Beispiel (in C++):

struct type { 
    int m; 
}; 

int main() 
{ 
    char type; 
    printf("sizeof(type) == %u\n", sizeof(type)); // Outputs 1 
    printf("sizeof(struct type) == %u\n", sizeof(struct type)); // Outputs 4 
    printf("sizeof(class type) == %u\n", sizeof(class type)); // Outputs 4 
} 

Meine Frage ist, ob es einen Weg gibt, um explizit auf eine typedef in C oder C++ zu beziehen. Etwas wie sizeof(typedef type) vielleicht (aber das funktioniert nicht).

Ich weiß, dass es üblich ist, verschiedene Namenskonventionen für Variablen und Typen zu verwenden, um diese Art von Situationen zu vermeiden, aber ich würde gerne wissen, ob es einen Weg in der Sprache gibt, oder nicht. :)

+2

Ihr Dateibereich typedef und Ihr block-scope 'char' Objekt haben denselben Namen. Die Lösung besteht darin, einen von ihnen umzubenennen, damit Sie eindeutig auf sie verweisen können. ("type" ist sowieso ein schlechter Name für einen Typ, es sei denn, es stellt tatsächlich einen Typ dar, z. B. im Code, der einen Compiler oder Interpreter implementiert.) –

+0

Dies wird aufgrund dieser Zeile nicht sauber kompiliert: char type; was wird char int; Dies wird entweder eine Alias- oder eine Maskierungswarnung auslösen.In jedem Fall wird der printf immer die lokale Variable 'type' verwenden. – user3629249

Antwort

9

Es gibt keine Möglichkeit, dieses zu lösen, aber wenn Ihre Struktur definiert ist global können Sie diese verwenden,

Bereichsoperator::.

printf("sizeof(type) == %zu\n", sizeof(::type)); 
+0

@AlexFarber: Ja, das ist mir gerade aufgefallen. Diese Frage dreht sich also ausschließlich um den Umfang. –

+0

@Venkatesh: Ja, du kannst. Aber nicht ein typedef und eine Variable. Dies ist jedoch zulässig: 'int main() {struct type {}; Int-Typ; } ' –

3

In C++ verwenden :: Operator die Antwort als 4.

printf("sizeof(::type) == %u\n", sizeof(::type)); 

Das :: verwendet wird, für den Zugriff auf globale Variablen in C++ zu erhalten. In C gibt es keinen direkten Weg, denke ich. Sie können es mit Funktionen tun.

Der Operator :: funktioniert auch, wenn es keine Klasse oder Struktur ist.

typedef int type1; 

int main() { 
int type1; 
cout<<sizeof(::type1); 
return 0; 
} 

Dies wird auch die Antwort als 4.

+0

Es gibt keinen' Strukturtyp'. 'type' ist keine Klasse. Können Sie den Einsteiger "struct" für Dinge verwenden, die keine Klassen sind? –

+0

Ich habe meine Antwort aktualisiert. @BenVoigt – shintoZ

+0

@jrok Bitte lesen Sie die Frage, für C++ Code, er nicht verwendet typedef und struct. – shintoZ

3

In C gibt dies nicht möglich ist. Sie verstecken den Typ type. Sie können es nicht als eine Art verwenden, nachdem Sie die char erklären:

typedef int type; 

int main(void) { 
    char type; 
    type t;  // error: expected ‘;’ before ‘t' 
    printf("%d %d\n", sizeof type, sizeof t); 
    return 0; 
} 

Wenn Sie jedoch einen Alias ​​für type erstellen oder eine type erklären, bevor Sie die char erklären können Sie verwenden, dass:

int main(void) { 
    type t; 
    char type; 
    printf("%d %d\n", sizeof type, sizeof t); 
    return 0; 
} 


int main(void) { 
    typedef type type_t; 
    char type; 
    printf("%d %d\n", sizeof type, sizeof(type_t)); 
    return 0; 
} 

C++ verfügt über den Bereichsauflösungsoperator ::, mit dem Sie den Typ mithilfe des qualifizierten Namens referenzieren können, z. B. ::type oder my_namespace::type.

+0

Ich akzeptiere diese Antwort, weil ich denke, dass es die beste Antwort ist. Es sagt mir, wie man sich auf einen "typedef" bezieht, der überschattet ist und nicht darauf beruht, dass "type" global ist. – wefwefa3