preprocesseur conversion entier vers chaine

Le
batyann811
Bonjour,

Peut-on utiliser le préprocesseur pour convertir une constante entière
en chaîne ? Je m'explique :

J'ai un constante entière

#define TAILLE_MAX 65536

Et je voudrais afficher un message du genre :

"La plus grande taille est : 65536"

Bien sûr le but du jeu est de ne pas utiliser printf et compagnie mais
seulement le préprocesseur. Possible ou pas ?
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Pierre Maurette
Le #19848121
batyann811, le 29/07/2009 a écrit :
Bonjour,

Peut-on utiliser le préprocesseur pour convertir une constante entière en
chaîne ? Je m'explique :

J'ai un constante entière

#define TAILLE_MAX 65536

Et je voudrais afficher un message du genre :

"La plus grande taille est : 65536"

Bien sûr le but du jeu est de ne pas utiliser printf et compagnie mais
seulement le préprocesseur. Possible ou pas ?



Sauf erreur de ma part, il n'y a aucun autre moyen portable de faire
afficher quelque chose par le préprocesseur que #error, qui arrête la
compilation.
De façon non portable, essayer un #pragma message ?
Si c'est vraiment important, il faudrait faire réaliser le boulot par
le "make", au sens large, si c'est possible. Je veux dire par exemple
lancer la construction par un script quelconque qui peut lancer ou non
un make, après avoir afficher votre message à partir d'une commande
shell ou autre. Si je devais le faire, je le ferais en Python, mais
c'est personnel.

--
Pierre Maurette
batyann811
Le #19848191
Pierre Maurette wrote:

Sauf erreur de ma part, il n'y a aucun autre moyen portable de faire
afficher quelque chose par le préprocesseur que #error, qui arrête la
compilation.



Je me suis mal fait comprendre on dirait. Le message doit être affiché
par le code C. Le preprocesseur doit géneré un constante chaîne.

#include
#define TAILLE_MAX 65536

/* Une macro qui genère la constante chaine "65536" */
#define TO_STR(X) ...

int main(void)
{
puts("La plus grand taille est" TO_STR(TAILLE_MAX));

return 0;
}
Erwan David
Le #19848351
batyann811
Pierre Maurette wrote:

Sauf erreur de ma part, il n'y a aucun autre moyen portable de faire
afficher quelque chose par le préprocesseur que #error, qui arrête
la compilation.



Je me suis mal fait comprendre on dirait. Le message doit être affiché
par le code C. Le preprocesseur doit géneré un constante chaîne.

#include
#define TAILLE_MAX 65536

/* Une macro qui genère la constante chaine "65536" */
#define TO_STR(X) ...

int main(void)
{
puts("La plus grand taille est" TO_STR(TAILLE_MAX));

return 0;
}



puts "la plus grande taille est " #TAILLE_MAX


--
Le travail n'est pas une bonne chose. Si ça l'était,
les riches l'auraient accaparé
Pierre Maurette
Le #19848341
batyann811, le 29/07/2009 a écrit :
Pierre Maurette wrote:

Sauf erreur de ma part, il n'y a aucun autre moyen portable de faire
afficher quelque chose par le préprocesseur que #error, qui arrête la
compilation.



Je me suis mal fait comprendre on dirait. Le message doit être affiché par le
code C. Le preprocesseur doit géneré un constante chaîne.

#include
#define TAILLE_MAX 65536

/* Une macro qui genère la constante chaine "65536" */
#define TO_STR(X) ...

int main(void)
{
puts("La plus grand taille est" TO_STR(TAILLE_MAX));

return 0;
}



Ah. C'est un classique. "preprocessor stringification", dans Google.

#define str(s) str_(s)
#define str_(s) #s
/* ... */
#define TAILLE_MAX 65536
/* ... */
puts("La plus grand taille est " str(TAILLE_MAX));

--
Pierre Maurette
Pierre Maurette
Le #19848331
(supersedes
batyann811, le 29/07/2009 a écrit :
Pierre Maurette wrote:

Sauf erreur de ma part, il n'y a aucun autre moyen portable de faire
afficher quelque chose par le préprocesseur que #error, qui arrête la
compilation.



Je me suis mal fait comprendre on dirait. Le message doit être affiché par
le code C. Le preprocesseur doit géneré un constante chaîne.

#include
#define TAILLE_MAX 65536

/* Une macro qui genère la constante chaine "65536" */
#define TO_STR(X) ...

int main(void)
{
puts("La plus grand taille est" TO_STR(TAILLE_MAX));

return 0;
}



Ah. C'est un classique. "preprocessor stringification", dans Google.

#define str(s) str_(s)
#define str_(s) #s
/* ... */
#define TAILLE_MAX 65536
/* ... */
puts("La plus grand taille est " str(TAILLE_MAX));

Je trouve quand ça vachement capillotracté par rapport à:

#define TAILLE_MAX 65536
/* ... */
printf("La plus grand taille est %s`n", TAILLE_MAX);

--
Pierre Maurette
Pierre Maurette
Le #19848321
(supersedes
(supersedes
batyann811, le 29/07/2009 a écrit :
Pierre Maurette wrote:

Sauf erreur de ma part, il n'y a aucun autre moyen portable de faire
afficher quelque chose par le préprocesseur que #error, qui arrête la
compilation.



Je me suis mal fait comprendre on dirait. Le message doit être affiché par
le code C. Le preprocesseur doit géneré un constante chaîne.

#include
#define TAILLE_MAX 65536

/* Une macro qui genère la constante chaine "65536" */
#define TO_STR(X) ...

int main(void)
{
puts("La plus grand taille est" TO_STR(TAILLE_MAX));

return 0;
}



Ah. C'est un classique. "preprocessor stringification", dans Google.

#define str(s) str_(s)
#define str_(s) #s
/* ... */
#define TAILLE_MAX 65536
/* ... */
puts("La plus grand taille est " str(TAILLE_MAX));

Je trouve quand ça vachement capillotracté par rapport à:

#define TAILLE_MAX 65536
/* ... */
printf("La plus grand taille est %d`n", TAILLE_MAX);

--
Pierre Maurette
Pierre Maurette
Le #19848311
(supersedes
(supersedes
(supersedes
batyann811, le 29/07/2009 a écrit :
Pierre Maurette wrote:

Sauf erreur de ma part, il n'y a aucun autre moyen portable de faire
afficher quelque chose par le préprocesseur que #error, qui arrête la
compilation.



Je me suis mal fait comprendre on dirait. Le message doit être affiché par
le code C. Le preprocesseur doit géneré un constante chaîne.

#include
#define TAILLE_MAX 65536

/* Une macro qui genère la constante chaine "65536" */
#define TO_STR(X) ...

int main(void)
{
puts("La plus grand taille est" TO_STR(TAILLE_MAX));

return 0;
}



Ah. C'est un classique. "preprocessor stringification", dans Google.

#define str(s) str_(s)
#define str_(s) #s
/* ... */
#define TAILLE_MAX 65536
/* ... */
puts("La plus grand taille est " str(TAILLE_MAX));

Je trouve quand ça vachement capillotracté par rapport à:

#define TAILLE_MAX 65536
/* ... */
printf("La plus grand taille est %dn", TAILLE_MAX);

--
Pierre Maurette
batyann811
Le #19848631
> Ah. C'est un classique. "preprocessor stringification", dans Google.

#define str(s) str_(s)
#define str_(s) #s
/* ... */
#define TAILLE_MAX 65536
/* ... */
puts("La plus grand taille est " str(TAILLE_MAX));

Je trouve quand ça vachement capillotracté par rapport à:

#define TAILLE_MAX 65536
/* ... */
printf("La plus grand taille est %dn", TAILLE_MAX);




Merci.

C'est sûr que c'est pénible je posais la question par curiosité. Dommage
que le préprocesseur ne puisse faire ça plus simplement.
zwim
Le #19848941
Le Wed, 29 Jul 2009 15:02:24 +0200
Pierre Maurette a écrit
Ah. C'est un classique. "preprocessor stringification", dans Google.

#define str(s) str_(s)
#define str_(s) #s



#define TAILLE_MAX 65536
/* ... */
puts("La plus grand taille est " str(TAILLE_MAX));

Je trouve quand ça vachement capillotracté par rapport à:

#define TAILLE_MAX 65536
/* ... */
printf("La plus grand taille est %dn", TAILLE_MAX);



Ca peut néanmoins être utilie pour des choses comme le n° de version
du code par exemple.

En gros si tu as :

#define PACKAGE_SVN_REVISION 23
/* obtenu par exemple au preprocess par un script externe */

#define str(s) str_(s)
#define str_(s) #s

const unsigned char
package_version[ ] = "package_v" str(PACKAGE_SVN_REVISION);

La constante ainsi définie a du sens, et généralement le programme
mère (qui comprend tous les packages) peut l'utiliser sans avoir a se
soucier qu'elle soit bien définie vu que c'est fait à la compilation.

Dans le cas où tu construis package_version à l'execution (avec un
printf), le main devra s'assurer que packageInit( ) est bien appelée
avant d'utiliser cette variable.


--
zwim.
Rien n'est impossible que la mesure de la volonté humaine...
nicolas.sitbon
Le #19849051
L'utilisation la plus courante est dans un scanf().
Publicité
Poster une réponse
Anonyme