c - 如何自动获取常量字符串的第一个字符作为常量字符?

标签 c gcc constants

是否可以重写以下内容,以便在字符串更改时我只需更改一处?

#define MY_STRING "Foo bar"
#define MY_STRING_FIRST_CHAR 'F'

以下是 Not Acceptable ,因为它引用了内存位置中的一个字符,所以它不能用作 switch 语句中的 case:

#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);
}

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

最佳答案

你可以通过将每个符号写一次来做到这一点......但是在不同的定义上

#include <stdio.h>

#define COMMAND_LIST_FIRST_CHAR   'l'
#define COMMAND_LIST              (char[]){ COMMAND_LIST_FIRST_CHAR, 'i', 's', 't', 0 }

int main(void) {
    char received_command_string[] = "list";
    switch (received_command_string[0]) {
        case COMMAND_LIST_FIRST_CHAR:
            printf("Doing the \"list\" stuff for '%s'\n", COMMAND_LIST);
            break;
        default:
            break;
    }
    return 0;
}

关于c - 如何自动获取常量字符串的第一个字符作为常量字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38614727/

相关文章:

c++ - syslog const char* 到字符串

javascript - 将 const 更改为数组

c - 在头文件的声明中定义结构的值

c - 数组结构

c - 在 C 中处理动态函数参数

c++ - 如何在没有 native 文件系统的情况下使用 gcc 检测选项

c++ - 构造函数继承和直接成员初始化

在 C 中创建自己的 FILE* 指针?

c++ - 在 g++ 而不是 VisualStudio 上编译错误

php - 接口(interface)常量、后期静态绑定(bind)