7
votes

Que fait la macro cmro suivante?

#ifndef INT64_C
#define INT64_C(c) (c ## LL)
#define UINT64_C(c) (c ## ULL)
#endif
What does ## mean in C? Is that a placeholder or function?
c

3 commentaires

Je recommande le langage de programmation C Chapitre 4 Section 11, et vous saurez tout sur les usages macro


@Jens considère intz3_c (2 + 2) * 100 - ici, pour obtenir le résultat attendu 400, les parenthèses sont nécessaires


@Anatolyg Tu as raison, je n'y pensais pas. Bonne prise! Commentaire supprimé.


4 Réponses :


10
votes

On appelle le opérateur de collage de jeton , il concaténe des jetons de sorte que < Code> 123313 ## ll devient 123313ll pendant le prétraitement.

Il y a aussi un opérateur de stringification # , qui convertit #name dans "nom" .


0 commentaires

4
votes

Non, ## n'est pas un espace réservé pour une fonction, il s'agit d'un opérateur de colle de jeton. Il n'est valide que dans les macros de préprocesseur (avec ou sans paramètres). Il produit une concaténation de ses côtés gauche et droit.

Par exemple, si vous passez intz_c une valeur de 123 xxx

Le résultat produit par le préprocesseur serait équivalent à l'écriture xxx

L'idée de ces macros consiste à faire de la constance signée et non signée dans le code un peu plus : une valeur qui ressemble à intz3_c (123) peut être un peu plus lisible que l'équivalent 123ll . C'est définitivement une forte amélioration par rapport à son autre équivalent 123ll , qui ressemble à un nombre complètement différent.


0 commentaires

4
votes

## signifie concaténer deux jetons.

SO (c ## ll) sera pré-traité à CLL .

mais faites attention, il est fait dans la phase de pré-traitement afin que ce ne soit pas comme strcat . xxx

générera malade au lieu de 3ll .


1 commentaires

Deux jetons, pas deux cordes.



2
votes

Comme d'autres personnes mentionnées, ## code> colle deux jetons ensemble.

#define INT64_C(c) (c ## L)


0 commentaires