gpt4 book ai didi

c - 如果缺少 const char* 数组初始化逗号,则生成编译器警告

转载 作者:行者123 更新时间:2023-12-02 02:46:04 25 4
gpt4 key购买 nike

我在我的 C 代码中经常使用字符串文字表。这些表或多或少都像这样:

static const char* const stateNames[STATE_AMOUNT] =
{
"Init state",
"Run state",
"Pause state",
"Error state",
};

上面代码的问题是,如果表变长了,在开发过程中修改了,我会时不时忘记逗号。代码编译没有问题,缺少逗号,但我的程序最终崩溃,因为最后一个字符串设置为 NULL .我使用了 MinGW 和 Keil 编译器来验证。

如果缺少逗号,有没有办法为我的初始化生成编译器警告?

最佳答案

每包const char*在一对括号中应该可以解决问题,如以下代码段所示:

static const char* const stateNames[5] =
{
("Init state"),
("Run state"),
("Pause state") //comma missing
("Pause state3"),
("Error state")
};

如果忘记逗号,则会得到类似于: error: called object is not a function or function pointer 的编译错误。

LIVE DEMO

请注意,如果您忘记了逗号,实际发生的情况是 C 实际上会连接两个(或更多)字符串,直到下一个逗号或数组末尾。例如,假设您忘记了逗号,如下所示:
static const char* const stateNames[] =
{
"Init state",
"Run state",
"Pause state" //comma missing
"Pause state3" //comma missing
"Error state"
};

int main(void)
{
printf("%s\n", stateNames[0]);
return 0;
}

这是什么 gcc-9.2 generates (其他编译器生成类似的代码):
.LC0:
.string "Init state"
.string "Run state"
.string "Pause statePause state3Error state" ; oooops look what happened
.quad .LC0
.quad .LC1
.quad .LC2
main:
push rbp
mov rbp, rsp
mov eax, OFFSET FLAT:.LC0
mov rdi, rax
call puts
mov eax, 0
pop rbp
ret

很明显,最后三个字符串是连接在一起的,并且数组的长度不是您所期望的。

关于c - 如果缺少 const char* 数组初始化逗号,则生成编译器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59926970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com