是否可以重寫以下內容,因此如果字符串更改,只需在一個位置更改?如何自動獲取常量字符的第一個字符作爲常量字符?
#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;
}
的目的是有效地通過查看一個字符來解析收到的字符串。在我的情況下,所有字符串都有一個唯一的字符以下是不是我的實際代碼,而是一個很簡單的例子來說明這樣的原則:
#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的文檔中: 「有沒有辦法一個宏參數轉換爲一個字符不變。」
我希望定義在一個包含文件中,它可以被幾個源文件共享。這是儘可能接近,而只有每個字符定義在一個地方:
#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);
}
我不會這樣做。最初的問題是如果可以共享一個定義來同時獲得字符串常量和字符常量。通過在運行時間浪費時鐘週期,我的問題有幾種解決方案。
有趣的問題。我懷疑這是可能的。但是聞起來像XY-問題。 –
如果你想使用case標籤中的字符,你需要一個[整型常量表達式](http://port70.net/~nsz/c/c99/n1256.html#6.6)。 – nwellnhof
[switch case:error:case label does not reduce to a integer constant]可能的重複(http://stackoverflow.com/questions/14069737/switch-case-error-case-label-does-not-reduce-to -an-integer-constant) – jweyrich