C macro – vérifie si une variable est un pointeur ou non

Je viens juste de commencer à penser à cela et je me demandais s’il existe un moyen “agréable” de vérifier si une variable passée à une macro dans c est un pointeur? c’est à dire:

#define IS_PTR(x) something int a; #if IS_PTR(a) printf("a pointer we have\n"); #else printf("not a pointer we have\n"); #endif 

L’idée n’est pas que cela se fasse à l’exécution, mais à la compilation, comme dans: nous obtenons un code différent selon que la variable est un pointeur ou non. Je voudrais donc que IS_PTR () évalue d’une certaine manière l’expression constante. Est-ce que je vais à propos de cette idée de la mauvaise façon?

Est-ce possible et comment cela serait-il fait? Merci d’avance!

Ce n’est certainement pas observable par le pré-processeur dans #if vous l’impliquez dans votre question. Le préprocesseur ne sait rien des types, uniquement des jetons et des expressions construits à partir de ceux-ci.

C11 dispose d’une nouvelle fonctionnalité qui vous permet d’observer un type de pointeur particulier, mais pas la “précision” en général. Par exemple, vous pourriez faire quelque chose

 #define IS_TOTOP(X) _Generic((X), default: 0, struct toto*: 1) 

ou si vous voulez que la macro fonctionne aussi pour les tableaux

 #define IS_TOTOPA(X) _Generic((X)+0, default: 0, struct toto*: 1) 

Certains compilateurs implémentent déjà cela, à savoir clang, et pour gcc et d’autres, vous pouvez déjà émuler cette fonctionnalité avec des fonctions intégrées, voir P99 .

NULL est à peu près la seule chose que vous puissiez rechercher. Il n’y a aucun moyen de déterminer si quelque chose est un pointeur.