struct abc
{
//some members
}arrayOf[10];
struct def
{
//some data memebers
}obj;
typedef void (*abc) (obj)
我不确定这句话typedef void (*abc) (obj)
意味着什么。请考虑到我是新手。
即使忽略缺少的分号,它也没有任何意义;这是一个错误。
如果obj
是一个类型名称,它将定义abc
为 type 的别名void (*)(obj)
,即,作为指向一个函数的指针,该函数接受一个 type 的参数obj
并返回void
。
但由于obj
是对象名称,而不是类型名称,这实际上并不是它的意思。
当我用 gcc 编译它时,我得到一个警告:
warning: parameter names (without types) in function declaration
当我用 编译时-pedantic-errors
,警告变成了致命错误。
旧式(非原型)函数定义可以合法地为参数指定名称,但不能指定类型:
void old_style_func(obj)
/* obj is implicitly of type int */
{
}
但这种形式对函数声明无效。在声明中,括号之间的单个标识符必须是类型名称,而不是参数名称——这使得声明成为原型。
gcc 的错误消息暗示它试图将它解释为好像它是旧式定义的开始,然后决定它是无效的,因为它只是一个声明。
底线是您应该密切注意编译器警告。
我们可以推测其意图。也许obj
是一个类型名称,而这个:
struct def
{
//some data memebers
}obj;
应该是:
typedef struct def
{
// some data members
} obj;
或者可能不小心省略了类型名称,最后一行应该是:
typedef void (*abc) (struct def obj);
尽管在这种情况下,该名称obj
被两次用于不同的目的(合法,但令人困惑)。但是如果没有更多的上下文,就不可能确定如何“修复”它。
这段代码是从哪里来的?你确定你已经向我们展示了确切的代码吗?当你试图编译它时发生了什么?
它将类型定义abc
为一个指向函数的指针,该函数接受一个被调用类型的参数int
并且obj
不返回任何内容 ( void
)。
它为指向函数的指针类型引入了一个新名称abc
,该函数接受obj
并返回void
。函数指针的类型总是在声明中以这种迂回的方式指定:
返回类型
(*
名称被声明的)(
参数列表)
顺便说一句,*
声明中的 可能是不必要的。函数类型总是在你需要的时候神奇地变成指向函数的类型(就像数组类型神奇地变成指向元素的类型),你可以直接使用函数类型(而不是指针指向-函数类型)来声明一个新函数。
正如其他人指出的那样,您提供的上下文没有名为的类型obj
,只有一个名为的对象obj
。如果此代码编译,则必须在其他obj
地方定义另一种类型,在您没有给出的代码中。