c中的这个陈述是什么意思?

Piy*_*ush 2 c struct pointers typedef

struct abc
{
//some members
}arrayOf[10];
struct def
{
//some data memebers
}obj;

typedef void (*abc) (obj)
Run Code Online (Sandbox Code Playgroud)

我不确定该陈述的typedef void (*abc) (obj)含义是什么.请考虑我是新手.

Kei*_*son 8

即使忽略丢失的分号,也没有任何意义; 这是一个错误.

如果obj是类型名称,它将定义abc为类型的别名void (*)(obj),即,作为指向函数的指针,该函数采用类型的单个参数obj并返回void.

但由于它obj是一个对象名,而不是一个类型名,实际上并不是它的意思.

当我用gcc编译它时,我收到一个警告:

warning: parameter names (without types) in function declaration
Run Code Online (Sandbox Code Playgroud)

当我编译时-pedantic-errors,警告变成致命错误.

旧式(非原型)函数定义可以合法地为参数指定名称,但不能指定类型:

void old_style_func(obj)
/* obj is implicitly of type int */
{
}
Run Code Online (Sandbox Code Playgroud)

但该表单对函数声明无效.在声明中,括号之间的单个标识符必须是类型名称,而不是参数的名称 - 这使得声明成为原型.

gcc的错误消息意味着它试图将其解释为它是旧式定义的开头,然后判断它是无效的,因为它只是一个声明.

最重要的是你应该密切关注编译器警告.

我们可以猜测是什么意思.也许obj是一个类型名称,这个:

struct def
{
    //some data memebers
}obj;
Run Code Online (Sandbox Code Playgroud)

应该是:

typedef struct def
{
    // some data members
} obj;
Run Code Online (Sandbox Code Playgroud)

或者可能是意外省略了类型名称,最后一行应该是:

typedef void (*abc) (struct def obj);
Run Code Online (Sandbox Code Playgroud)

虽然在这种情况下,该名称obj被用于不同目的两次(合法但令人困惑).但没有更多的背景,就不可能确定如何"修复"它.

这段代码来自哪里?你确定你已经向我们展示了确切的代码吗?你试图编译它时发生了什么?