Ist es möglich, das Folgende neu zu schreiben, so dass ich nur an einer Stelle wechseln muss, wenn sich die Zeichenkette ändert?Wie kann ich automatisch das erste Zeichen einer konstanten Zeichenkette als konstantes Zeichen erhalten?
#define MY_STRING "Foo bar"
#define MY_STRING_FIRST_CHAR 'F'
Das folgende ist nicht akzeptabel, da sie in einer Speicherstelle zu einem char Bezug nehmen, so kann es nicht als ein Fall in einer switch
Anweisung verwendet werden:
#define MY_STRING_FIRST_CHAR MY_STRING[0]
switch (something) {
case MY_STRING_FIRST_CHAR:
break;
}
Der Zweck ist, effizient Analysieren einer empfangenen Zeichenfolge durch Betrachten eines Zeichens. In meinem Fall haben alle Strings ein eindeutiges Zeichen. Das Folgende ist nicht mein eigentlicher Code, sondern ein sehr einfaches Beispiel, das Prinzip zu zeigen:
#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:
// Do the "list" stuff
break;
case COMMAND_CHANGE_FIRST_CHAR:
// Do the "change" stuff
break;
case COMMAND_EXIT_FIRST_CHAR:
// Do the "exit" stuff
break;
}
User „PMG“ fand diese in der gcc Dokumentation: „Es gibt keine Möglichkeit, ein Makro-Argument in ein Zeichen zu konvertieren Konstante."
Ich wollte, dass die Definitionen in einer Include-Datei enthalten sind, die von mehreren Quelldateien gemeinsam genutzt werden kann. Das ist so nah, wie ich während nur jedes Zeichen haben an einem Ort definiert bekommen kann:
#include <stdio.h>
#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_FIRST_CHAR CH0
void main(void){
printf("The string is %s, the first char is %c\n", MY_STRING, MY_STRING_FIRST_CHAR);
}
Ich werde es auf diese Weise nicht tun. Die ursprüngliche Frage war, ob es möglich ist, eine Definition zu teilen, um sowohl eine Zeichenkette als auch eine Zeichenkonstante zu erhalten. Durch die Verschwendung von Taktzyklen zur Laufzeit gibt es mehrere Lösungen für mein Problem.
Interessante Frage zu bewegen. Ich bezweifle, dass es möglich ist. Aber riecht nach XY-Problem für mich. –
Wenn Sie das Zeichen in einer Groß-/Kleinschreibung verwenden möchten, benötigen Sie einen [ganzzahligen Konstantenausdruck] (http://port70.net/~nsz/c/c99/n1256.html#6.6). – nwellnhof
Mögliches Duplikat von [Schalter Groß-/Kleinschreibung: Fehler: Groß-/Kleinschreibung wird nicht auf eine Ganzzahlkonstante reduziert] (http://stackoverflow.com/questions/14069737/switch-case-error-case-label-does-not-reduceto- -an-integer-constant) – jweyrich