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

typedef void (*abc) (obj)

我不确定这句话typedef void (*abc) (obj)意味着什么。请考虑到我是新手。

4

3 回答 3

8

即使忽略缺少的分号,它也没有任何意义;这是一个错误。

如果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被两次用于不同的目的(合法,但令人困惑)。但是如果没有更多的上下文,就不可能确定如何“修复”它。

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

于 2013-04-25T17:17:51.230 回答
2

它将类型定义abc为一个指向函数的指针,该函数接受一个被调用类型的参数int并且obj不返回任何内容 ( void)。

于 2013-04-25T17:10:33.257 回答
0

它为指向函数的指针类型引入了一个新名称abc,该函数接受obj并返回void。函数指针的类型总是在声明中以这种迂回的方式指定:

返回类型 (* 名称被声明的)(参数列表)

顺便说一句,*声明中的 可能是不必要的。函数类型总是在你需要的时候神奇地变成指向函数的类型(就像数组类型神奇地变成指向元素的类型),你可以直接使用函数类型(而不是指针指向-函数类型)来声明一个新函数。

正如其他人指出的那样,您提供的上下文没有名为的类型obj,只有一个名为的对象obj。如果此代码编译,则必须在其他obj地方定义另一种类型,在您没有给出的代码中。

于 2013-04-25T17:15:35.533 回答