次のように書き直すことはできますか?文字列が変更された場合、変更する必要があるのは1か所だけです。定数文字列の最初の文字を定数文字として自動的に取得する方法はありますか?
#define MY_STRING "Foo bar"
#define MY_STRING_FIRST_CHAR 'F'
がswitch
文でケースとして使用することができないので、それは、メモリ位置にチャーを指すので、以下は許容されない:
#define MY_STRING_FIRST_CHAR MY_STRING[0]
switch (something) {
case MY_STRING_FIRST_CHAR:
break;
}
目的が効率的です1文字を見て受信した文字列を解析します。私の場合、すべての文字列には一意の文字が1つあります。以下は、原理を示すために、私の実際のコードが、非常に単純な例ではありません。
#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;
}
ユーザー「PMGは、」GCCのドキュメントでこれを見つけた: 「文字にマクロ引数を変換する方法はありません定数。"
定義は、いくつかのソースファイルで共有できるインクルードファイルに入れたかったのです。これは私が得ることができる限り近くにあり、すべての文字は1か所にしか定義されていません。
#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);
}
私はそうしません。元の質問は、1つの定義を共有して文字列定数と文字定数の両方を取得できるかどうかでした。実行時にクロックサイクルを無駄にすることで、私の問題に対するいくつかの解決策があります。
興味深い質問にあなたのスイッチ/ケースから処理コードを移動する必要があります。私はそれが可能であるとは思わない。しかし、私にはXY問題のようなにおいがします。 –
ケースラベルの文字を使用する場合は、[整数定数式](http://port70.net/~nsz/c/c99/n1256.html#6.6)が必要です。 – nwellnhof
[switch case:error:大文字小文字のラベルが整数定数に還元されない可能性があります](http://stackoverflow.com/questions/14069737/switch-case-error-case-label-does-not-reduce-to) -an-integer-constant) – jweyrich