2016-11-06 2 views
-3

Ich versuche C zu lernen, indem ich einige Quellcodes zeilenweise aufspalte. Ich stieß auf (was ich denke) Typ-Deklarationen in Klammern innerhalb von Ausdrücken (?) Und ich frage mich, warum das gemacht wird. Hier sind die Beispiele, die mich für eine Schleife werfen.Warum Typdeklarationen in Klammern für Ausdrücke?

static void foo(int a) 
{ 
    (void)a; // Why the parantheses and void inside of it? 
} 
struct bar *a = (struct bar *)calloc(1, sizeof(struct bar)); 
//^Why declare struct bar pointer? 

Auf den ersten Annahmen, ich kann mir vorstellen, es hat etwas mit zwingt die Ergebnisse oder Werte zu tun hat, die Erklärung zu entsprechen, aber im Fall der Funktion Beispiel, warum nicht nur foo(void) tun?

Wenn es auch einen Namen für dieses Muster gibt (weil ich mich schwer benenne oder beschreibe, was vor sich geht), wäre es für mich einfacher, später danach zu suchen.

Danke!

+3

C und C++ sind ** verschiedene * Sprachen! Nach was fragst du? – Olaf

+0

@Olaf Ich meinte C. C++ war nur ein vorgeschlagenes Tag, mit dem ich ging. Ich entschuldige mich für die Verwirrung. – MSD

+0

Nein, war es nicht! Syntax-Vervollständigung ist keine Empfehlung. – Olaf

Antwort

1

Sie sind C-Style-Casts. Verwenden Sie sie nicht in C++. Es gibt einen Fall, der die Verwendung von C-Style-Casting in C++ erfordert, aber ich habe NIE in meiner gesamten Karriere einen Bedarf gehabt.

Übertragungen sagen dem Compiler, dass eine Variable eines Typs einen anderen Typ hat.

Das Umsetzen eines Ausdrucks auf void teilt dem Compiler mit, dass Sie sich nicht um das Ergebnis kümmern. Dies kann Warnungen vermeiden, wenn Sie Ihrem Compiler sagen, dass er über alles meckern soll.

+0

"Casts sagen dem Compiler, dass eine Variable eines Typs einen anderen Typ hat." - Ähm, ... nein. Es weist den Compiler an, ein Objekt in ein anderes zu konvertieren. C hat keine Umdeutung. Typ-Punning soll nur über Unionen erfolgen, über Pointer-Casting wird UB aufgerufen (es gibt eine Ausnahme für 'char' und' void * '). – Olaf

2

Die Aussage

(void)a; 

Referenzen a und dann erhalten Sie nicht ein Compiler Warnung, dass a eine nicht verwendete Variable ist.

Die (void) ist nur die erforderliche Syntax.

Sie zweite Frage

struct bar *a; 

würde eine Variable zeigt auf diese Art von struct definieren. Aber zur gleichen Zeit, Sie es Initialisierung mit

struct bar *a = (struct bar *)calloc(1, sizeof(struct bar)); 

Dies wäre die gleich wie

struct bar *a; 
a = (struct bar *)calloc(1, sizeof(struct bar)); 

aber in C ist es wohl besser, nicht den Rückgabewert von calloc und anderen Zuordnungsfunktionen zu werfen . Ich würde diese Zeile schreiben als

a = calloc(1, sizeof *a); 
+1

Warum ist '(void)' erforderlich? –

+1

'(void)' ist nicht "erforderliche Syntax", es ist eine Konvention, die einige Compiler in Bezug auf die nicht verwendete Variable Warnung befolgen –

+0

@ M.M Eigentlich nicht erforderlich in MSVC, wo die einfache 'a;' ist genug. Ich habe von anderen Posts verstanden, dass es ein Mangel war. –

Verwandte Themen