如何自动将常量字符串的第一个字符作为常量字符?

Han*_*ans 5 c gcc constants

是否可以重写以下内容,因此如果字符串发生变化,我只需要在一个地方进行更改?

#define MY_STRING "Foo bar"
#define MY_STRING_FIRST_CHAR 'F'
Run Code Online (Sandbox Code Playgroud)

以下是不可接受的,因为它引用了内存位置中的char,因此它不能用作switch语句中的大小写:

#define MY_STRING_FIRST_CHAR MY_STRING[0]

switch (something) {
    case MY_STRING_FIRST_CHAR:
        break;
}
Run Code Online (Sandbox Code Playgroud)

目的是通过查看一个字符来有效地解析收到的字符串.在我的例子中,所有字符串都有一个唯一字符 以下不是我的实际代码,而是一个非常简单的示例来说明原理:

#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;
}
Run Code Online (Sandbox Code Playgroud)

用户"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);
}
Run Code Online (Sandbox Code Playgroud)

我不会那样做.最初的问题是,是否可以共享一个定义以获得字符串常量和字符常量.通过在运行时浪费时钟周期,我的问题有几种解决方案.

小智 -4

#define MY_STRING "Hello"

const char var[] = MY_STRING;

switch(var[0]) {
    case 'H':
    break;
    case 'A':
    break;
}
Run Code Online (Sandbox Code Playgroud)

这应该可以解决它。

  • 它可以用在“switch”语句中吗?大家,在回答之前先阅读问题! (3认同)