GCC 编译错误,围绕标量初始值设定项 [-Werror]
GCC compilation error, braces around scalar initializer [-Werror]
我是 C 编程的新手,我尝试创建一个包含 char 和函数指针的结构,这就是问题所在。
我想更改该代码:
switch (flag) {
case 'd':
case 'i':
return (my_put_nbr(va_arg(ap, int)));
case 'p':
return (my_putstr("0x") + my_l_base_changer(va_arg(ap, char *),
16));
case 'u':
return (my_put_unbr(va_arg(ap, unsigned int)));
case 'b':
return (my_u_base_changer(va_arg(ap, unsigned int), 2, 0));
case 'o':
return (my_u_base_changer(va_arg(ap, unsigned int), 8, 0));
case 'x':
return (my_u_base_changer(va_arg(ap, unsigned int), 16, 0));
case 'X':
return (my_u_base_changer(va_arg(ap, unsigned int), 16, 1));
default:
return (0);
}
在那种代码中:
typedef struct fptr
{
char op;
int (*ptr)(va_list);
} fptr;
fptr fptrs[]=
{
{ 's', ft_print_nb_spec },
{ 'S', ft_print_nb_up },
{ 0, NULL }
};
int i = 0;
while (fptrs[i++].op != flag && fptrs[i].op != 0);
if (fptrs[i].op != 0)
{
fptrs[i].ptr();
}
我的结构包含一个函数指针,指向获得不同原型的函数
我的结构是这样的:
typedef struct action {
char flag;
void *function;
} action;
我的代码有这样的错误:
action registers[] = {
{ 'd', (int *)(*my_put_nbr)(int) },
{ 'i', (int)(*my_put_nbr)(va_arg(ap, int)) },
{ 'p', (int)(*my_print_ptr)(va_list ap) },
{ 'u', (int)(*my_put_unbr)(va_arg(ap, unsigned int)) },
{ 'b', (int)(*my_u_base_changer)(va_arg(ap, unsigned int), 2, 0) },
{ 'o', (int)(*my_u_base_changer)(va_arg(ap, unsigned int), 8, 0) },
{ 'x', (int)(*my_u_base_changer)(va_arg(ap, unsigned int), 8, 0) },
{ 'X', (int)(*my_u_base_changer)(va_arg(ap, unsigned int), 8, 1) },
{ 0, NULL }
};
当我 运行 gcc 得到它时:
flag_nbr.c:13:28: error: expected expression before ‘int’
{ 'd', (int)(my_put_nbr)(int) },
^~~
flag_nbr.c:13:28: error: missing initializer for field ‘function’ of ‘printf_action {aka struct <anonymous>}’ [-Werror=missing-field-initializers]
In file included from flag_nbr.c:8:0:
../include/my.h:21:8: note: ‘function’ declared here
void *function;
^~~~~~~~
flag_nbr.c:14:10: error: initialization makes pointer from integer without a cast [-Werror=int-conversion]
{ 'i', (int)(my_put_nbr)(va_arg(ap, int)) },
^
我不明白那个错误...
如有疑问,请检查数据类型!!
您将变量定义为指向 action
类型的指针数组。
您在初始化程序中传递的是大括号括起来的列表,它肯定与指向 action
类型的指针不匹配。
换句话说,您尝试传递一个大括号括起来的列表,而期望是一个指针。现在,指针的初始值设定项应该是 奇异值 ( 或标量,您可以称它为 ),因此大括号是不是强制性的。
虽然这是完全正确的,但大多数时候,这可能是由于您写了一些您不打算写的东西(例如:您的案例!!),因此,gcc
产生一个警告。
您可能想要更改数组类型以保存类型 action
的结构,而不是指向它们的指针。
您正在使用 typedef 为已经具有相同名称的结构命名,请检查。
这可能不是主要原因。
我是 C 编程的新手,我尝试创建一个包含 char 和函数指针的结构,这就是问题所在。
我想更改该代码:
switch (flag) {
case 'd':
case 'i':
return (my_put_nbr(va_arg(ap, int)));
case 'p':
return (my_putstr("0x") + my_l_base_changer(va_arg(ap, char *),
16));
case 'u':
return (my_put_unbr(va_arg(ap, unsigned int)));
case 'b':
return (my_u_base_changer(va_arg(ap, unsigned int), 2, 0));
case 'o':
return (my_u_base_changer(va_arg(ap, unsigned int), 8, 0));
case 'x':
return (my_u_base_changer(va_arg(ap, unsigned int), 16, 0));
case 'X':
return (my_u_base_changer(va_arg(ap, unsigned int), 16, 1));
default:
return (0);
}
在那种代码中:
typedef struct fptr
{
char op;
int (*ptr)(va_list);
} fptr;
fptr fptrs[]=
{
{ 's', ft_print_nb_spec },
{ 'S', ft_print_nb_up },
{ 0, NULL }
};
int i = 0;
while (fptrs[i++].op != flag && fptrs[i].op != 0);
if (fptrs[i].op != 0)
{
fptrs[i].ptr();
}
我的结构包含一个函数指针,指向获得不同原型的函数
我的结构是这样的:
typedef struct action {
char flag;
void *function;
} action;
我的代码有这样的错误:
action registers[] = {
{ 'd', (int *)(*my_put_nbr)(int) },
{ 'i', (int)(*my_put_nbr)(va_arg(ap, int)) },
{ 'p', (int)(*my_print_ptr)(va_list ap) },
{ 'u', (int)(*my_put_unbr)(va_arg(ap, unsigned int)) },
{ 'b', (int)(*my_u_base_changer)(va_arg(ap, unsigned int), 2, 0) },
{ 'o', (int)(*my_u_base_changer)(va_arg(ap, unsigned int), 8, 0) },
{ 'x', (int)(*my_u_base_changer)(va_arg(ap, unsigned int), 8, 0) },
{ 'X', (int)(*my_u_base_changer)(va_arg(ap, unsigned int), 8, 1) },
{ 0, NULL }
};
当我 运行 gcc 得到它时:
flag_nbr.c:13:28: error: expected expression before ‘int’
{ 'd', (int)(my_put_nbr)(int) },
^~~
flag_nbr.c:13:28: error: missing initializer for field ‘function’ of ‘printf_action {aka struct <anonymous>}’ [-Werror=missing-field-initializers]
In file included from flag_nbr.c:8:0:
../include/my.h:21:8: note: ‘function’ declared here
void *function;
^~~~~~~~
flag_nbr.c:14:10: error: initialization makes pointer from integer without a cast [-Werror=int-conversion]
{ 'i', (int)(my_put_nbr)(va_arg(ap, int)) },
^
我不明白那个错误...
如有疑问,请检查数据类型!!
您将变量定义为指向 action
类型的指针数组。
您在初始化程序中传递的是大括号括起来的列表,它肯定与指向 action
类型的指针不匹配。
换句话说,您尝试传递一个大括号括起来的列表,而期望是一个指针。现在,指针的初始值设定项应该是 奇异值 ( 或标量,您可以称它为 ),因此大括号是不是强制性的。
虽然这是完全正确的,但大多数时候,这可能是由于您写了一些您不打算写的东西(例如:您的案例!!),因此,gcc
产生一个警告。
您可能想要更改数组类型以保存类型 action
的结构,而不是指向它们的指针。
您正在使用 typedef 为已经具有相同名称的结构命名,请检查。 这可能不是主要原因。