2016-11-10 2 views
1

Je vais dans certains fichiers d'en-tête et voir qu'il ya beaucoup de prototypes fonctionnent comme ceci:Comment appelez-vous des fonctions avec __P dans le prototype?

returntype some_name __P(arguments); 

Si je devais appeler cette fonction, comment puis-je le faire? Dois-je utiliser quelque chose comme

some_name(arguments); 

à l'exclusion du __P, ou est-il une autre façon d'appeler ces fonctions?

+0

Pourriez-vous lier le fichier d'en-tête qui inclut cela afin que nous puissions y jeter un coup d'œil? –

+0

Où avez-vous trouvé ces déclarations? Pouvez-vous en montrer un? C'est probablement une macro qui s'étend à quelque chose. – Banex

+0

Ceci est le lien vers le fichier d'en-tête [Link] (web.mit.edu/~jik/sipbsrc/i386_nbsd1/webster/src/server/dbm/PORT/sys/db.h/) Il a quelque chose comme vide \t __dbpanic __P ((DB * dbp)); Comment puis-je appeler __dbapanic? Juste __dapanic (* dbp) ou d'une autre manière –

Répondre

4

Ce type de prototype utilise une macro __P pour permettre l'inclusion et la compilation sur de très vieux systèmes qui ne supportent pas les prototypes C90 (aka ansi prototypes).

Sur la plupart des systèmes, l'argument de la macro __P étend à la liste des arguments, comme illustré ci-dessous:

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

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

Sur les systèmes obsolètes, la déclaration ci-dessus se développe pour int some_name(); alors qu'il se développe au prototype complet autrement: int some_name(int argc, char *argv[]);

ignorer la __P macro et utiliser some_name(arguments); syntaxe pour appeler la fonction. Notez également que le nom de la macro __P n'est pas significatif, l'auteur du package aurait pu utiliser n'importe quel nom à cette fin.

+0

Donc c'est un héritage de l'âge de pierre? Intéressant quel effort ppl faire juste pour éviter de porter le code à mideval C au moins ... – Olaf

+1

@Olaf Habituellement, les personnes qui évitent ne sont pas les mêmes qui font l'effort. –

+0

@EugeneSh .: Peut-être pour les librairies commerciales. Mais alors, un client qui utilise encore un tel logiciel (ou même un nouveau) devrait penser trois fois, car de tels héritages cachent souvent des problèmes plus profonds (comme une mauvaise maintenance). De tels hacks sont souvent ajoutés à (libs ou code usier) si le développeur d'origine n'est plus disponible et que personne ne comprend vraiment le code. – Olaf