Ssortingngify C prétraitement

Ceci est mon premier message. Par conséquent, si je suis trop vague ou si je donne des informations que tout le monde suppose de manière intuitive, merci de me le faire savoir.

Je suis très novice en écriture en C et j’essaie simplement de mieux comprendre le prétraitement. gcc -Wall -std=c99 -DSEED=argument un programme simple qui peut prendre des arguments directement depuis la console en utilisant gcc -Wall -std=c99 -DSEED=argument , où mon argument doit être un entier, ou si le -D n’est pas défini, l’utilisateur entrez-le.

La valeur SEED est simplement utilisée dans srand() . Je suis très confus pourquoi mon code ne comstackra pas si je mets dans un -DSEED=a alors que si je mets -DSEED=1 il comstackra. Je reçois une erreur “âaâ non déclaré (première utilisation dans cette fonction)” et je ne comprends vraiment pas la différence entre les deux. Je pensais que #define correspondait au type de variable avec l’entrée, donc si je mettais un “a” #SEED serait un caractère et si je mettais un “1” #SEED serait un int.

Si le SEED n’est pas défini, j’utilise une commande #ifndef SEED et cela fonctionne bien. Je pense que je suis censé “ssortingngifier” l’entrée SEED et pouvoir ensuite vérifier s’il s’agit d’un entier ou non. Après avoir lu quelques articles en ligne, j’essaie d’utiliser:

 #ifndef SEED //code #else #define TO_STRING( input ) #input char c; c = TO_STRING( SEED ) //Then I was going to use c to figure out if it was an int. #endif 

Cela ne fonctionne pas et toute personne capable de signaler les idées fausses que vous pensez que je pourrais avoir serait grandement appréciée.

EDIT – J’ai donc -DSEED=a pourquoi je -DSEED=a le message d’erreur en essayant -DSEED=a , car il le lisait comme une variable.

Pour ssortingngifier un #define vous devez utiliser une approche en deux étapes:

 #define _STRINGIFY(s) #s #define STRINGIFY(s) _STRINGIFY(s) ... #define SEED 123 ... const char * pszSeed = STRINGIFY(SEED); /* 'pszSeed' would point to "123" form here on. */ 

Si vous ne souhaitez utiliser qu’un seul caractère, accédez-y simplement via *pszSeed ou pszSeed[0] .