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

乔尼·舒伯特

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

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

上面代码的问题是,如果表变长了并且在开发过程中被修改了,我会不时忘记逗号。代码可以编译,不会出现逗号丢失的问题,但是由于最后一个字符串设置为,我的程序最终崩溃了NULL我使用MinGW和Keil编译器进行了验证。

如果缺少逗号,有什么方法可以为我的初始化生成编译器警告吗?

戴维·斯帕塔罗(Davide Spataro)

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不得到编译器警告的情况下初始化char * args []

C4838警告,const char *数组的数组初始化

初始化一个 const char* 数组

const char编译器优化

初始化并打印const char指针

C / C ++将char数组初始化为const char *

声明时无法使用初始化列表初始化const char * / string数组的向量

如何初始化和访问 const char* const*

初始化固定大小的char数组而没有足够的空终止符空间时,没有编译器错误

从const char数组初始化为动态分配的const char数组

为什么在构造函数初始化程序中初始化 const char 数组成员不兼容?

C ++数组const char

初始化const char数组作为重载函数的参数

静态const char *的C ++内联初始化

如何在C ++中初始化char * const argv []

从'const char *'到struct中的'char'/未初始化const成员的无效转换

如果将错误的参数类型传递给结构初始化程序列表,编译器为什么不生成编译错误?

将const Char *转换为Char数组

来自 const char* 类型的临时对象的 cost char*& 类型的非常量引用的无效初始化

类型“ const char *”的值不能用于初始化“ char *”类型的实体

我的编译器为我的代码显示了这些错误。1)[错误] char 数组初始值设定项中的多余元素 2)[错误](接近 'arr' 的初始化)

(const char *)++或(const char)++?

重新引用const char *数组

在C中初始化char数组

C char数组初始化

类中的Char数组初始化

无法初始化char数组

如何初始化struct char数组?

错误:无法使用类型为“ const char [34]”的左值初始化类型为“ const char”的返回对象