我有这样的代码:
typedef char **Runlevel[];Runlevel runlevel_default = {
{ "/usr/bin/test", NULL },
};如果我试图编译它,就会收到如下警告:
warning: braces around scalar initializerwarning: initialization of ‘char **’ from incompatible pointer type ‘char *’warning: excess elements in scalar initializer然而,当我这样写它时:
char *args[] = { "/usr/bin/test", NULL };
Runlevel runlevel_default = {
args
};我没有收到任何警告。有什么问题吗?
编辑:我的目标是创建一个运行级别数组。就像保罗·奥格尔维的评论一样,我去掉了嵌套的括号,但现在当我做这样的事情时:
Runlevel runlevel_default[] = {
{ "/usr/bin/test", NULL }
};我收到了另一个错误:error: array type has incomplete element type ‘Runlevel’ {aka ‘char **[]’}
现在有什么问题吗?
发布于 2021-03-24 09:29:42
您的typedef char **Runlevel[];语句并不定义您想要的内容;使用该语句,RunLevel不是char*指针的二维数组,而是char**元素的1-D数组。因此,runlevel_default变量的后续初始化不仅有太多的大括号,而且单个元素(字符串文本和NULL令牌)类型错误(它们是“有效”的char*值,而不是char**)。
所以,您可能需要的是类似于typedef char *Runlevel[][];的东西,但这是无效的,因为只有多维数组的一个维度可以有一个未指定的大小,在这样的数组类型声明/初始化时由编译器来确定。
因此,假设数组的每个子元素都是两个(只有两个) char*指针(可能是字符串文本),那么需要将2指定为最后一个(最内部)维度:
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类型变量,具有不同的“外部”维度,如下所示:
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
};https://stackoverflow.com/questions/66776880
复制相似问题