Est-il possible de réécrire ce qui suit pour que je n'aie à modifier qu'un seul endroit si la chaîne change ?
#define MY_STRING "Foo bar"
#define MY_STRING_FIRST_CHAR 'F'
L'exemple suivant n'est pas acceptable car il se réfère à un caractère dans un emplacement mémoire, il ne peut donc pas être utilisé comme un cas dans une instruction switch
:
#define MY_STRING_FIRST_CHAR MY_STRING[0]
switch (something) {
case MY_STRING_FIRST_CHAR:
break;
}
Le but est d'analyser efficacement une chaîne reçue en regardant un seul caractère. Dans mon cas, toutes les chaînes ont un caractère unique. Ce qui suit n'est pas mon code réel, mais un exemple très simple pour montrer le principe :
#define COMMAND_LIST "list"
#define COMMAND_LIST_FIRST_CHAR 'l'
#define COMMAND_CHANGE "change"
#define COMMAND_CHANGE_FIRST_CHAR 'c'
#define COMMAND_EXIT "exit"
#define COMMAND_EXIT_FIRST_CHAR 'e'
switch(received_command_string[0]){
case COMMAND_LIST_FIRST_CHAR:
// Faire les actions "list"
break;
case COMMAND_CHANGE_FIRST_CHAR:
// Faire les actions "change"
break;
case COMMAND_EXIT_FIRST_CHAR:
// Faire les actions "exit"
break;
}
L'utilisateur "pmg" a trouvé ceci dans la documentation de gcc : "Il n'y a pas de moyen de convertir un argument macro en une constante de caractère."
Je voulais que les définitions soient dans un fichier d'inclusion pouvant être partagé par plusieurs fichiers source. Voici la solution la plus proche que je puisse obtenir en ne définissant chaque caractère qu'à un seul endroit :
#include
#define CH0 'F'
#define CH1 'o'
#define CH2 'o'
#define CH3 ' '
#define CH4 'b'
#define CH5 'a'
#define CH6 'r'
static char MY_STRING[] = { CH0, CH1, CH2, CH3, CH4, CH5, CH6, '\0'};
#define MY_STRING_PREMIER_CHAR CH0
void main(void){
printf("La chaîne est %s, le premier caractère est %c\n", MY_STRING, MY_STRING_FIRST_CHAR);
}
Je ne le ferai pas de cette façon. La question initiale était de savoir s'il est possible de partager une définition pour obtenir à la fois une constante de chaîne et une constante de caractère. En gaspillant des cycles d'horloge au moment de l'exécution, il existe plusieurs solutions à mon problème.