Was macht eigentlich (void)var?

Lesezeit: 4 Minuten

Benutzer-Avatar
Diti

Folgendes berücksichtigen main():

int main(int argc, char *argv[])
{
    return (0);
}

Beim Kompilieren mit cc -Wall -Wextrawerden Warnungen mit der Aufschrift „nicht verwendeter Parameter“ generiert.

Wenn ich keinen Parameter in einer Funktion verwenden muss (zum Beispiel in a Signal-Handler-Funktion das macht keinen Gebrauch von seinem int Parameter), bin ich es gewohnt, Folgendes zu tun:

  int main(int argc, char *argv[])
  {
      (void)argc;
      (void)argv;
      return (0);
  }

(Dazu speziell main()sehe ich manchmal andere Leute tun: argv = argv - argc + argc)

Aber was macht (void)var eigentlich tun?

ich verstehe das (void) ist eine Besetzung, also werfe ich die Variable weg? Was bedeutet die var; Linie (ohne Besetzung) tun? Ist es eine leere Zuweisung, ein leerer Ausdruck?

Ich möchte verstehen, was eigentlich vor sich geht.

  • Wenn expr keinen lvalue hat und kein Funktionsaufruf ist, dann expr; ist eine Aussage ohne Wirkung. Es tut nichts. Schreiben (void) expr; unterdrückt die Warnung einer Anweisung ohne Wirkung. Schreiben einer Erklärung ohne Wirkung expr darin werden Warnungen zum Schweigen gebracht, die mit der Nichtverwendung verbunden sind expr in einer Funktion wo expr erscheint in der Parameterliste.

    – Brandin

    10. Januar 2014 um 16:37 Uhr

Benutzer-Avatar
JVMATL

Es ist nur eine Möglichkeit, einen “harmlosen” Verweis auf die Variable zu erstellen. Der Compiler beschwert sich nicht über eine unbenutzte Variable, weil Sie auf den Wert verwiesen haben, und er beschwert sich nicht, dass Sie nichts mit dem Wert des Ausdrucks gemacht haben var weil Sie es explizit in void (nichts) umgewandelt haben, was darauf hinweist, dass Sie sich nicht um den Wert gekümmert haben.

Ich habe diese Verwendung bei Variablen noch nie gesehen (weil sich der von mir verwendete Compiler normalerweise nicht über unbenutzte Funktionsargumente beschwert), aber ich sehe, dass dies häufig verwendet wird, um dem Compiler anzuzeigen, dass Sie sich nicht wirklich um den Rückgabewert von kümmern eine Funktion. printf(), gibt beispielsweise einen Wert zurück, aber 99 % der C-Programmierer wissen nicht (oder interessieren sich nicht dafür), was er zurückgibt. Damit sich einige pingelige Compiler oder Lint-Tools nicht über einen ungenutzten Rückgabewert beschweren, können Sie den Rückgabewert in void umwandeln, um anzuzeigen, dass Sie wissen, dass er vorhanden ist, und dass Sie sich ausdrücklich nicht darum kümmern.

Abgesehen davon, dass Sie dem Compiler Ihre Absicht mitteilen (dass Sie sich nicht um diesen Wert kümmern), ist dies eigentlich nicht der Fall tun irgendetwas – es ist nur ein Hinweis für den Compiler.

Benutzer-Avatar
ouah

  (void)argc;
  (void)argv;

Wenn ein Funktionsargument nicht verwendet wird, wie in Ihrem Programm, dann ist dies die idiomatische Art, die von einigen Compilern ausgegebene Warnung vor unbenutzten Funktionsargumenten zu unterdrücken. Kein anständiger Compiler wird mit diesen Anweisungen Code generieren.

Es wertet das Argument aus, macht aber nichts damit, was dazu führt, dass die meisten Compiler keine Warnung ausgeben. Das (void) cast wird verwendet, damit der Compiler keine weitere Warnung erzeugt, die darauf hinweist, dass der Wert nicht verwendet wird.

Ein weiterer beliebter Weg, um die Warnung zu unterdrücken, ist Folgendes:

variable = variable;

Beachten Sie, dass ich einige Compiler kenne, die in Gegenwart von:

(void) arg;

wie “Anweisung ohne Wirkung”.

  • Danke vielmals! Ich wusste nicht, dass andere Fehler (“Anweisung ohne Wirkung”) mit dieser Technik ausgelöst werden können. Meine Schule erstellt unsere Projekte mit -Werrorund ich möchte eine tatsächliche Note, haha!

    – Diti

    10. Januar 2014 um 13:42 Uhr

  • Für das, was es wert ist, kompiliert meine Firma auch mit -Werror: Es ist schmerzhaft, wenn Sie es für ein großes Projekt zum ersten Mal einschalten, aber nicht so schlimm, wenn Sie damit beginnen, und auf lange Sicht, je mehr Warnungen Sie einschalten und loslassen, desto besser ist Ihr Code – der Compiler findet nicht nur echte Probleme für Sie, sondern Programmierer sind gezwungen, mehr über die Sprache zu lernen, während sie herausfinden, wie sie bestimmte Warnungen vermeiden können, und das hilft ihnen, langfristig bessere Programmierer zu sein Lauf.

    – JVMATL

    10. Januar 2014 um 13:51 Uhr


  • @JVMATL Eines der Probleme mit -Werror in einem Makefile befindet, wird es normalerweise den Kompilierungsprozess beenden, während Sie vielleicht daran interessiert sind, einen Gesamtüberblick mit dem Dump aller Warnungen zu erhalten.

    – au

    10. Januar 2014 um 14:37 Uhr

  • @ouah Wenn Sie ‘make -k’ (-k == “weitermachen”) verwenden, erhalten Sie immer noch alle (die meisten) Ihrer Warnungen. Es sei denn, Sie verwenden rekursive Makefiles.. 🙂 (aegis.sourceforge.net/auug97.pdf)

    – JVMATL

    10. Januar 2014 um 16:17 Uhr


  • @JVMATL aber “weitermachen” würde den Prozess auch für die anderen (nicht kompilierten) Fehler fortsetzen, die möglicherweise nicht das gewünschte Verhalten sind.

    – au

    10. Januar 2014 um 16:49 Uhr

Wie andere Personen richtig bemerkt haben, unterdrückt es nur eine Compiler-Warnung über nicht verwendete Variablen in Ihrem Code. Übrigens hat Win32 definiert UNREFERENCED_PARAMETER Makro, um dieses Ziel zu erreichen. Mein Vorschlag, so etwas in Ihrem Code zu machen:

#ifdef _WIN32
# define UNUSED(x) UNREFERENCED_PARAMETER(x)
#else
# define UNUSED(x) (void) x
#endif

Dies kann die Codeeffizienz erhöhen, da der Funktionsaufruf die Register für Argumente nicht laden muss.

1299530cookie-checkWas macht eigentlich (void)var?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy