我在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
请注意,如果您忘记了逗号,则实际发生的情况是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
生成的(其他编译器生成类似的代码):
.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
显然,最后三个字符串是连接在一起的,数组不是您期望的长度。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句