Ich habe eine Header-Datei, die enthält
#define PROTOTYPE(s) s
Was ist der Sinn davon? Scheint, als würde es nur die Eingabe durch sich selbst ersetzen.
Es gibt Unmengen anderer Richtlinien, aber die einzige, bei der anscheinend eine Peilung nur überprüft wurde, wenn sie definiert ist : #ifndef PROTOTYPE
. Ich habe einige Stellen in HDF4-Header-Dateien gefunden, die dies tun : #define PROTOTYPE
. Nichts davon klärt meine Frage wirklich. Scheint immer noch ziemlich nutzlos.
So wird es verwendet:
CS_RETCODE clientmsg_callback PROTOTYPE((
CS_CONTEXT * context,
CS_CONNECTION *connection,
CS_CLIENTMSG *clientmsg));
Dies ist Teil eines Projekts, das Sybase Open Client verwendet. clientmsg_callback wird später hier verwendet:
ct_callback(context, NULL, CS_SET, CS_CLIENTMSG_CB,
(CS_VOID *)clientmsg_callback);
Ich gehe von hier aus von einem Beispielprogramm ab:
clientmsg_callback wird später implementiert. Ich denke, das Beispiel wurde ursprünglich mit Blick auf C anstelle von C ++ geschrieben. Vielleicht hat das etwas damit zu tun?
#if
/#ifdef
/#ifndef
/#else
Direktiven, in denen es stattdessen eine andere Definition geben könnte? Es könnte einen Unterschied machen, wenn es in anderen Makros verwendet wird, insbesondere in der Nähe von#
oder##
. Es könnte nur für einen Kommentarstil sein. Nicht genug Kontext, um wirklich zu antworten.PROTOTYPE
. Wenn Sie seltsame Definitionen im Code sehen, die nutzlos erscheinen, denken Sie über mögliche Flexibilität nach, wenn jemand etwas bequem ändern möchte.Antworten:
In den alten Tagen von wirklich, wirklich frühem C gab es keinen Prototyp. Funktionsargument Listen kamen nach der Funktion der Klammern, wie folgt :
Heutzutage stehen die Argumente natürlich in Klammern:
Beachten Sie den "fehlenden" Rückgabetyp. C-Funktionen, die verwendet wurden, um implizit zurückzukehren
int
, und nur wenn Sie einen anderen Rückgabetyp benötigten, mussten Sie sagen, was es war.Funktion Erklärungen noch eine weitere Reihe von Regeln hatte. Eine Funktionsdeklaration in K & R C (der alten Version) hatte keine Argumente:
Und Funktionsprototypen in ANSI C haben eine Liste von Argumenten:
Während des Übergangs verwendeten die Leute verrückte Makros, um beide Möglichkeiten zu kompilieren:
Mit
das würde auf die erste Version erweitert.
Mit
es würde sich auf die Sekunde ausdehnen.
In Bezug auf die "zusätzlichen" Klammern im Code in der Frage werden sie benötigt, wenn die Argumentliste mehr als ein Argument enthält. Ohne sie hat der Makroaufruf mehr als ein Argument, sodass ein mit nur einem Argument definiertes Makro nicht übereinstimmt:
quelle
#define PROTOTYPE(s)
mit dem Eingangint x;
in eingeschaltet wirdx
? Es sieht so aus, als würde es sich für mich in eine leere Schnurzlib.h
Kopfzeile aus der zlib-Bibliothek mit demOF()
Makro gesehen werden: github.com/madler/zlib/blob/master/zlib.hzconf.h
.Makros wie dieses würden in den Prototypen in der Header-Datei verwendet, um Folgendes zu ermöglichen:
Wenn ANSI C erkannt wurde (
__STDC__
definiert als 1), würde dies erweitert werden zu:Wenn ANSI C nicht erkannt wird, wird dies erweitert auf:
was üblich war, bevor C standardisiert wurde.
Einige Bibliotheken tun dies immer noch; Wenn Sie nachsehen
tcpd.h
(wenn Sie es zur Verfügung haben), werden Sie sehen:Das erklärt es gut.
Was die doppelten Klammern betrifft,
__P(arg1, arg2)
würde dies einen Syntaxfehler ergeben (Übergabe zu vieler Argumente an das Makro), während__P((arg1, arg2))
dies in Ordnung wäre (nur eines in Klammern eingeschlossen).Dies ist ähnlich wie
__extension__((...))
in GNU C. In Nicht-GNU-Compilern ist es einfach#define __extension__(unused)
, semi-portablen Code zu haben, da nur ein "Argument" in Klammern angegeben ist.quelle