c - GCC 编译错误,围绕标量初始值设定项 [-Werror]

标签 c gcc compiler-errors initializer scalar

我是 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();
  } 

我的结构包含一个函数指针,指向获得不同原型(prototype)的函数

我的结构是这样的:

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 的结构,而不是指向它们的指针。

关于c - GCC 编译错误,围绕标量初始值设定项 [-Werror],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47354206/

相关文章:

C++ 警告 : division of double by zero

python - 我的python 3代码与python 2有何不同?

c# - 从引用的程序集自动生成主要方法

c - 遍历数组并删除打印数组的第 i 个字符

python - 为什么 PyObject_IsInstance 在我的示例代码中总是返回 0

gcc 的 C++ 部分模板特化问题

linux - 如何在内联汇编中通过 syscall 或 sysenter 调用系统调用?

Cplex库gcc编译链接错误

python - 只是好奇Python+Numpy来实时手势识别

java - 如何将 Java 空参数传递给使用 JNA 编译为 C 代码的 native 方法?