Das Verständnis der genauen Bedeutung von "void" - Schlüsselwort in C/C++

Wie bereits erklärt, zum Beispiel, hier, es gibt 3 wesentliche Anwendungen für das void-Schlüsselwort (mehr erfahrener C/C++ - Programmierer können überspringen, um die 4. verwenden):

1) Als Rückgabetyp für die Funktion, die nichts zurückgibt,. Diese
verursacht ein code-Beispiel wie diese:

void foo();
int i = foo();

erzeugen einen compiler-Fehler.

2) Als die einzigen parameter in einer Funktion parameter-Liste. AFAIK, eine leere Funktion parameter-Liste ist genau die gleiche, die für den compiler und daher die folgenden 2 Zeilen sind identisch in der Bedeutung:
(edit: es ist nur wahr in c++. Die Kommentare zeigen den Unterschied in c).

int foo();
int foo(void);

3) void* ist eine spezielle Art von generischen Zeiger- es kann auf alle Variablen, die nicht deklariert mit der const-oder volatile-Schlüsselwort, Konvertierung zu/von jeder Art von Daten-Zeiger und Punkt-für alle nicht-member-Funktionen. Darüber hinaus kann nicht aufgelöst werden. Ich gebe keine Beispiele.

Gibt es auch eine 4. verwenden Sie, dass verstehe ich nicht:

4) In die bedingte Kompilierung es wird Häufig in dem Ausdruck (void)0 wie folgt:

//procedure that actually prints error message 
void _assert(char* file, int line, char* test); 
#ifdef NDEBUG 
#define assert(e) ((void)0) 
#else
#define assert(e)     \
((e) ? (void)0 :   \
__assert(__FILE__, __LINE__, #e)) 
#endif

Ich versuche zu verstehen, das Verhalten dieses Ausdrucks durch Experimente. Alle folgenden gültig sind (kompilieren gut):

int foo(); //some function declaration
int (*fooPtr)(); //function pointer
void(foo);
void(fooPtr);
void(0);
(void)0;
void('a');
void("blabla");
exampleClass e; //some class named exampleClass with a default ctor
void(e);
static_cast<void>(e);

diese sind aber nicht:

void(0) //no semicolon
int i = void(0);

Kann ich daraus schließen, dass "void" (im Rahmen des 4. verwenden) ist einfach eine Besondere Art, dass jede Art werfen kann (ob es im c-Stil oder cpp-Stil), und es kann nie verwendet werden, als lvalue oder rvalue?

  • 2 ist das nur wahr, über C++, in C eine leere Funktion Parameterliste bedeutet die Funktion akzeptiert eine beliebige Anzahl nicht angegebener Argumente.
  • Sie können sich auch wieder einen Ausdruck void von einer Funktion, deren Rückgabetyp ist void.
  • Sie können tun, dass in C++, aber nicht in C. in C, eine void-Funktion kann nur einer bloßen return;. (C99 6.8.6.4p1.)
  • Sind Sie sicher, dass void(e); kompiliert in C++?
  • Die Antwort auf deine Letzte Frage ist nicht: void() schafft ein rvalue vom Typ void.
  • das ist, warum ich hasse Fragen über "die C/C++ - Sprache."
  • ich verstehe es nicht
  • void(e) == (void)e == static_cast<void>(e). Es ist eine gängige Redewendung zum Ausdruck, dass Sie eine variable absichtlich nicht verwendet.
  • Ich glaube nicht, dass es sich lohnt, zu versuchen zu verstehen, was void selbst bedeutet. Es ist nur ein Schlüsselwort, das bedeutet, verschiedene Dinge in verschiedenen Kontexten. Ähnlich wie die keyword - static bedeutet wie 8 verschiedene Dinge in C++, und ich glaube nicht, dass Sie finden, eine einzige definition, die vollständig erklärt.

InformationsquelleAutor infokiller | 2011-11-06
Schreibe einen Kommentar