Déclaration de pointeur de fonction – que fait __P?

La forme habituelle des définitions de pointeur de fonction est la suivante:

int function(int, int); int (*ptr)(int, int); 

mais j’ai vu une forme aujourd’hui que je n’ai pas comprise. Quelqu’un peut-il expliquer cela s’il vous plaît?

 int (*close) __P((struct __db *)); 

La macro __P() est généralement utilisée pour prendre en charge les implémentations de C à partir de l’époque de K & R C, lorsqu’il n’y avait pas de prototypes (introduits dans C avec C89). Fondamentalement, la logique est

 #if SOME_LOGIC_TO_TEST_WHETHER_IMPLEMENTATION_SUPPORTS_PROTOTYPES # define __P(argument_list) argument_list #else # define __P(argument_list) () #endif 

Pouvez-vous voir comment cela fonctionne lorsqu’il est appliqué à votre exemple? Notez que pour que cela fonctionne et ne provoque pas d’erreur de syntaxe, la liste d’arguments doit inclure les parenthèses de l’ appel de fonction , pas seulement les parenthèses de la macro de type fonction . D’où les doubles parenthèses lors de l’utilisation de la macro. C’est probablement la raison pour laquelle cela semble inhabituel.

__P() est juste une macro. Sur mon système, il est défini comme suit (dans sys/cdefs.h ):

 #if defined(__STDC__) || defined(__cplusplus) #define __P(protos) protos /* full-blown ANSI C */ #else /* !(__STDC__ || __cplusplus) */ #define __P(protos) () /* traditional C preprocessor */ #endif /* !__GNUC__ */ 

De là, il semble être utilisé pour maintenir la compatibilité avec les (très) anciens compilateurs.

La forme habituelle des définitions de pointeur de fonction est … mais j’ai vu une forme aujourd’hui que je ne comprenais pas.

Il n’y a rien de spécial ici, pas de syntaxe magique. Ce n’est pas une forme différente de déclaration de pointeur de fonction.

Ceci est simplement la forme standard de déclaration de pointeur de fonction, et __P() est une macro définie par l’un des fichiers d’en-tête que vous utilisez. Alors, trouvez cette définition de macro pour savoir quel est son but.