2016-11-10 3 views
1

Ich habe durch einige Header-Dateien sind und sehen, dass es viele Funktionsprototyp wie diese sind:Wie rufen Sie Funktionen mit __P im Prototyp auf?

returntype some_name __P(arguments); 

Wenn ich diese Funktion aufrufen, waren wie ich es tun? Verwende ich so etwas wie

some_name(arguments); 

mit Ausnahme der __P, oder gibt es eine andere Möglichkeit, solche Funktionen zu nennen?

+0

Könnten Sie die Header-Datei, die das enthält, verlinken, damit wir es uns ansehen können? –

+0

Wo haben Sie solche Erklärungen gefunden? Kannst du eins zeigen? Es ist wahrscheinlich ein Makro, das sich zu etwas ausdehnt. – Banex

+0

Dies ist der Link zu der Header-Datei [Link] (web.mit.edu/~jik/sipbsrc/i386_nbsd1/webster/src/server/dbm/PORT/sys/db.h/) Es hat so etwas wie void \t __dbanic __P ((DB * dbp)); Wie rufe ich __dbapanic an? Nur __dapanic (* dbp) oder auf andere Art und Weise –

Antwort

4

Diese Art von Prototyp verwendet ein Makro __P, um Aufnahme und Kompilierung auf sehr alten Systemen zu ermöglichen, die keine C90-Prototypen unterstützen (auch bekannt als ansi Prototypen).

Auf den meisten Systemen das Argument für den __P Makro erweitert auf die Argumentliste, wie unten dargestellt:

#ifdef __USING_STONE_AGE_COMPILER__ 
#define __P(args) () 
#else 
#define __P(args) args 

int some_name __P((int argc, char *argv[])); 

auf veralteten Systemen erweitert die obige Erklärung int some_name(); während es sonst zum vollständigen Prototyp erweitert: int some_name(int argc, char *argv[]);

Ignorieren Sie einfach das __P Makro und verwenden Sie die Syntax some_name(arguments);, um die Funktion aufzurufen. Beachten Sie auch, dass der Makroname __P nicht signifikant ist, der Autor des Pakets könnte einen beliebigen Namen für diesen Zweck verwendet haben.

+0

Das ist also ein steinzeitliches Vermächtnis? Interessant, was für eine Mühe pppl machen, nur um zu verhindern, dass Code zumindest in den mittleren C portiert wird ... – Olaf

+1

@Olaf Normalerweise sind die Leute, die meiden, nicht die gleichen, die sich die Mühe machen. –

+0

@EugeneSh .: Vielleicht für kommerzielle libs. Aber dann sollte ein Kunde, der immer noch solche (oder sogar neue) nutzt, dreimal nachdenken, da solche Vermächtnisse oft tiefere Probleme (wie schlechte Wartung) verbergen. Solche Hacks werden oft hinzugefügt (libs oder usier code), wenn der ursprüngliche Entwickler nicht mehr verfügbar ist und niemand den Code wirklich versteht. – Olaf

Verwandte Themen