Czy można przepisać dalej, więc muszę zmienić tylko w jednym miejscu, jeśli zmienia się ciąg?W jaki sposób mogę automatycznie uzyskać pierwszy znak stałego łańcucha jako stałą postać?
#define MY_STRING "Foo bar"
#define MY_STRING_FIRST_CHAR 'F'
Poniżej jest nie do przyjęcia, ponieważ odnosi się do char w miejscu pamięci, więc nie może być stosowany jako przypadek w switch
stwierdzeniem:
#define MY_STRING_FIRST_CHAR MY_STRING[0]
switch (something) {
case MY_STRING_FIRST_CHAR:
break;
}
Celem jest efektywne przeanalizuj otrzymany ciąg, patrząc na jeden znak. W moim przypadku wszystkie ciągi mają jedną unikalną postać. Poniższa nie jest mój rzeczywisty kod, ale bardzo prosty przykład, aby pokazać zasadę:
#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;
}
użytkownika „PMG” Znalazłem to w gcc dokumentacji: „Nie ma sposobu, aby przekształcić makro argumentu w charakterze stały."
Chciałem, aby definicje znajdowały się w pliku włączającym, który może być współdzielony przez kilka plików źródłowych. Jest to tak blisko, jak tylko mogę uzyskać, mając tylko jeden znak zdefiniowany w jednym miejscu:
#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);
}
Nie zrobię tego w ten sposób. Pierwotne pytanie brzmiało, czy możliwe jest udostępnienie jednej definicji, aby uzyskać zarówno stałą łańcuchową, jak i stałą znaku. Przez marnowanie cykli zegara w czasie działania istnieje kilka rozwiązań mojego problemu.
ciekawe pytanie. Wątpię, czy to możliwe. Ale pachnie dla mnie problemem XY. –
Jeśli chcesz użyć znaku w etykiecie sprawcy, będziesz potrzebować [wyrażenia w liczbie całkowitej] (http://port70.net/~nsz/c/c99/n1256.html#6.6). – nwellnhof
Możliwy duplikat [sprawy przełączania: błąd: etykieta przypadku nie redukuje się do stałej całkowitej] (http://stackoverflow.com/questions/14069737/switch-case-error-case-label-does-not-reduce-to -an-integer-constant) – jweyrich