首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我会收到警告:标量初始化器周围的大括号?

为什么我会收到警告:标量初始化器周围的大括号?
EN

Stack Overflow用户
提问于 2021-03-24 07:58:37
回答 1查看 230关注 0票数 1

我有这样的代码:

代码语言:javascript
复制
typedef char **Runlevel[];
代码语言:javascript
复制
Runlevel runlevel_default = {
    { "/usr/bin/test", NULL },
};

如果我试图编译它,就会收到如下警告:

  • warning: braces around scalar initializer
  • warning: initialization of ‘char **’ from incompatible pointer type ‘char *’
  • warning: excess elements in scalar initializer

然而,当我这样写它时:

代码语言:javascript
复制
char *args[] = { "/usr/bin/test", NULL };

Runlevel runlevel_default = {
    args
};

我没有收到任何警告。有什么问题吗?

编辑:我的目标是创建一个运行级别数组。就像保罗·奥格尔维的评论一样,我去掉了嵌套的括号,但现在当我做这样的事情时:

代码语言:javascript
复制
Runlevel runlevel_default[] = {
    { "/usr/bin/test", NULL }
};

我收到了另一个错误:error: array type has incomplete element type ‘Runlevel’ {aka ‘char **[]’}

现在有什么问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-24 09:29:42

您的typedef char **Runlevel[];语句并不定义您想要的内容;使用该语句,RunLevel不是char*指针的二维数组,而是char**元素的1-D数组。因此,runlevel_default变量的后续初始化不仅有太多的大括号,而且单个元素(字符串文本和NULL令牌)类型错误(它们是“有效”的char*值,而不是char**)。

所以,您可能需要的是类似于typedef char *Runlevel[][];的东西,但这是无效的,因为只有多维数组的一个维度可以有一个未指定的大小,在这样的数组类型声明/初始化时由编译器来确定。

因此,假设数组的每个子元素都是两个(只有两个) char*指针(可能是字符串文本),那么需要将2指定为最后一个(最内部)维度:

代码语言:javascript
复制
typedef char* Runlevel[][2];

Runlevel runlevel_default = {
    { "/usr/bin/test", NULL },
    { "/usr/bin/test2", NULL },
    { "/usr/bin/test3", NULL },
};

使用此语法,typedef中的“空”维度的值将由编译器根据您在(也是大括号括起来的)初始化列表中包含多少大括号括起来的char*值来确定;在上面的代码中,runlevel_default变量将像声明的char* runlevel_default[3][2]一样。但是,您也可以声明一个不同的Runlevel类型变量,具有不同的“外部”维度,如下所示:

代码语言:javascript
复制
Runlevel runlevel_different = {
    { "/usr/bin/test", NULL },
    { "/usr/bin/test2", NULL },
    { "/usr/bin/test3", NULL },
    { "/usr/bin/test4", NULL },
    { "/usr/bin/test5", NULL }, // This time, we have 5 as the outer dimension
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66776880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档