GCC编译错误,标量初始值设定项[-Werror]周围的大括号

GCC编译错误,标量初始值设定项[-Werror]周围的大括号,c,gcc,compiler-errors,initializer,scalar,C,Gcc,Compiler Errors,Initializer,Scalar,我是C编程新手,我尝试创建一个包含字符和函数指针的结构,这就是问题所在 我想更改该代码: 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 (m

我是C编程新手,我尝试创建一个包含字符和函数指针的结构,这就是问题所在

我想更改该代码:

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 }
};
我的代码中有这样的bug:

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)) },
        ^
flag_nbr.c:13:28:错误:“int”之前应为表达式
{'d',(int)(my_put_nbr)(int)},
^~~
flag_nbr.c:13:28:错误:“printf_action{aka struct}”的字段“function”缺少初始值设定项[-Werror=缺少字段初始值设定项]
在flag_nbr.c中包含的文件中:8:0:
../include/my.h:21:8:注意:此处声明了“函数”
void*函数;
^~~~~~~~
flag_nbr.c:14:10:错误:初始化从整数生成指针,但没有强制转换[-Werror=int转换]
{'i',(int)(my_put_nbr)(va_arg(ap,int))},
^

我不理解这个错误…

如果有疑问,请检查数据类型

将变量定义为指向
操作
类型的指针数组

在初始值设定项中传递的是大括号内的列表,它肯定与指向
操作的指针
类型不匹配

换句话说,当需要指针时,您尝试传递一个大括号括起来的列表。现在,指针的初始值设定项应该是一个单数值(或标量,您可以这样称呼它),所以括号不是必需的

虽然这是完全正确的,但在大多数情况下,这可能是由于您编写了不打算编写的内容(例如:您的案例!!)而导致的,因此,
gcc
会对此发出警告


您可能希望更改数组类型以保存类型为
action
的结构,而不是指向它们的指针。

如有疑问,请检查数据类型

将变量定义为指向
操作
类型的指针数组

在初始值设定项中传递的是大括号内的列表,它肯定与指向
操作的指针
类型不匹配

换句话说,当需要指针时,您尝试传递一个大括号括起来的列表。现在,指针的初始值设定项应该是一个单数值(或标量,您可以这样称呼它),所以括号不是必需的

虽然这是完全正确的,但在大多数情况下,这可能是由于您编写了不打算编写的内容(例如:您的案例!!)而导致的,因此,
gcc
会对此发出警告


您可能希望更改数组类型,以保存类型为
action
的结构,而不是指向它们的指针。

如果要使用typedef为已具有相同名称的结构命名,请选中该选项。
这可能不是主要原因。

您正在使用typedef为已经具有相同名称的结构命名,请检查该名称。

这可能不是主要原因。

action*寄存器[]
-->
action寄存器[]
函数指针实际上更像函数调用。分配函数指针时,只指定函数的名称。也许你应该确切地解释一下你想通过这样做来完成什么。我想要一个结构列表,其中包含一个标志和指向与标志相关的函数的指针,因此使用这个方法,我想要“emule”一个开关事例或if林,只有一个while和一个if,如:int I=-1;while(fptrs[++i].op!=标志和&fptrs[i].op!=0);如果(fptrs[i].op!=0){fptrs[i].ptr();},则不能通过
void*
调用函数。您需要确切地知道调用它的函数签名是什么,并且需要向它传递参数。最好使用
switch
语句来确定调用什么以及如何调用。您当前拥有的内容清晰简洁。我建议将其保留为,而不要试图用函数指针使事情过于复杂。
action*寄存器[]
-->作为函数指针的操作寄存器[]实际上看起来更像函数调用。分配函数指针时,只指定函数的名称。也许你应该确切地解释一下你想通过这样做来完成什么。我想要一个结构列表,其中包含一个标志和指向与标志相关的函数的指针,因此使用这个方法,我想要“emule”一个开关事例或if林,只有一个while和一个if,如:int I=-1;while(fptrs[++i].op!=标志和&fptrs[i].op!=0);如果(fptrs[i].op!=0){fptrs[i].ptr();},则不能通过
void*
调用函数。您需要确切地知道调用它的函数签名是什么,并且需要向它传递参数。最好使用
switch
语句来确定调用什么以及如何调用。您当前拥有的内容清晰简洁。我建议将其保留为,而不尝试对函数指针进行过度复杂化。好的,我找到了它,但是,C中的标量初始值设定项是什么?我怀疑,如果修复它,将在函数指针(如果可以调用)的使用方式上引发更多的问题。@dbush嗯,现在有一个更大的问题,OP打算如何将FP转换为其原始类型?@SouravGhosh。函数指针对新手来说不容易理解。我知道,但我知道如何在这种情况下进行切换,但这需要很多代码行,函数指针更有用。我发现了,但是,C中的标量初始值设定项是什么?我怀疑修复它会在函数指针的方式上引发更多问题(如果可以这样称呼的话)被使用。@dbush好吧,现在有一个更大的问题,OP打算如何将FP转换为它们的原始类型?@SouravGhosh完全正确。函数指针对新手来说不容易理解。我知道,但我知道如何在这种情况下进行切换,但那就是