Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

preprocesseur conversion entier vers chaine

14 réponses
Avatar
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 ?

10 réponses

1 2
Avatar
Pierre Maurette
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
Avatar
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 <stdio.h>

#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;
}
Avatar
Erwan David
batyann811 écrivait :

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 <stdio.h>

#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é
Avatar
Pierre Maurette
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 <stdio.h>

#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
Avatar
Pierre Maurette
(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 <stdio.h>

#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
Avatar
Pierre Maurette
(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 <stdio.h>

#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
Avatar
Pierre Maurette
(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 <stdio.h>

#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
Avatar
batyann811
> 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.
Avatar
zwim
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...
Avatar
nicolas.sitbon
L'utilisation la plus courante est dans un scanf().
1 2