Was macht (void) ‘variable name’ am Anfang einer C-Funktion? [duplicate]

Lesezeit: 2 Minuten

Ich lese diesen Beispielcode von FUSE:

http://fuse.sourceforge.net/helloworld.html

Und ich habe Probleme zu verstehen, was das folgende Code-Snippet tut:

static int hello_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
                         off_t offset, struct fuse_file_info *fi)
{
    (void) offset;
    (void) fi;

Insbesondere die Sache mit dem (ungültigen) “Variablennamen”. Ich habe diese Art von Konstrukt noch nie zuvor in einem C-Programm gesehen, daher weiß ich nicht einmal, was ich in das Google-Suchfeld eingeben soll. Meine derzeit beste Vermutung ist, dass es sich um eine Art Spezifizierer für nicht verwendete Funktionsparameter handelt? Wenn jemand weiß, was das ist und mir helfen könnte, wäre das großartig. Vielen Dank!

  • Kam hierher, während ich den Sicherungscode las: D

    – Millie Smith

    25. November 2015 um 19:54 Uhr

Es umgeht einige Compiler-Warnungen. Einige Compiler warnen, wenn Sie keinen Funktionsparameter verwenden. In einem solchen Fall haben Sie diesen Parameter möglicherweise absichtlich nicht verwendet, sind aus irgendeinem Grund nicht in der Lage, die Schnittstelle zu ändern, möchten aber trotzdem die Warnung schließen. Dass (void) Das Casting-Konstrukt ist ein No-Op, das die Warnung verschwinden lässt. Hier ist ein einfaches Beispiel mit clang:

int f1(int a, int b)
{
  (void)b;
  return a;
}

int f2(int a, int b)
{
  return a;
}

Bauen Sie mit der -Wunused-parameter Flagge und presto:

$ clang -Wunused-parameter   -c -o example.o example.c
example.c:7:19: warning: unused parameter 'b' [-Wunused-parameter]
int f2(int a, int b)
                  ^
1 warning generated.

  • Wäre es nicht semantischer zu verwenden #define IGNORE_UNUSED(var) (void)(var) dann?

    – orlp

    8. September 2011 um 21:51 Uhr

  • @nightcracker, ich weiß nicht, was “semantischer” bedeutet, aber die Verwendung des OP ist eine ziemlich verbreitete Redewendung.

    – Karl Norum

    8. September 2011 um 21:52 Uhr

  • @Carl Norum: Ah, wenn es eine gängige Redewendung ist, dann macht es keinen Sinn, dieses Makro dafür zu verwenden.

    – orlp

    8. September 2011 um 21:54 Uhr

  • Es ist dasselbe wie die UNREFERENCED_PARAMETER Makro

    – Marlon

    9. September 2011 um 1:27 Uhr


  • Cool, das macht Sinn. Vielen Dank!

    – fyhuang

    12. September 2011 um 4:27 Uhr

Es tut nichts, in Bezug auf den Code.

Es ist hier, um dem Compiler mitzuteilen, dass diese Variablen (in diesem Fall Parameter) nicht verwendet werden, um das zu verhindern -Wunused Warnungen.

Eine andere Möglichkeit, dies zu tun, ist die Verwendung von:

#pragma unused

1419060cookie-checkWas macht (void) ‘variable name’ am Anfang einer C-Funktion? [duplicate]

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

Privacy policy