2011-04-25 95 views
3

完成noob到C,刚刚开始有些蠢蠢欲动,想知道如何(读取“if”)以下是可能的。函数指针和指针参数在C

尝试创建一个struct,其成员是一个函数指针,并且函数指针指向一个函数,该函数采用与上述struct相同类型的参数。例如(介意的语法,刚开始熟悉这里):

typedef struct{ 
    void (*myStructFunc)(void); 
} MyStructType; 

void myFunc(void){ 
    printf("Hello world!"); 
} 

// ... 

MyStructType myStruct; 
myStruct.myStructFunc = &myFunc; 
myStruct.myStructFunc(); // <= Hello world! 

工作正常,但是当我尝试将MyStructType类型的参数介绍的功能:

typedef struct{ 
    void (*myStructFunc)(*MyStructType); // <= parse error 
} MyStructType; 

void myFunc(MyStructType *myStruct){ 
    printf("Hello world!"); 
} 

// ... 

MyStructType myStruct; 
myStruct.myStructFunc = &myFunc; 
myStruct.myStructFunc(&myStruct); 

这些例子由于显而易见的原因是简短的,但它们说明了我的意图。再次,只是让我的脚湿C所以请原谅任何语法上的无知。

反正我怎么能做到这一点?很显然,我在语法上做了一些不正确的事情,或者我试图做一些明显不可能的事情。

另请注意,这是纯粹的学术原因。

+0

P.S.玩得开心实施面向对象。 ;) – 2011-04-25 03:36:22

回答

2

解析错误是从*MyStructType来了,这似乎是一个错字,你已经正确申报的实际功能定义的结构指针。

修复仍然是一个错误,因为在struct定义时,typedef未生效。

typedef struct { 
    node *next; // error - what is a node? 
    void *data; 
} node; // this is where node is defined 

为了解决这个问题,你需要使用一个名为struct:同样的问题可以用一个链表来说明(更清晰恕我直言)

struct node { 
    struct node *next; 
    void *data; 
}; 

或将typedef第一,然后再定义在(命名)struct

typedef struct node node; 

struct node { 
    node *next; 
    void *data; 
}; 

或者(如果你感到讨厌)只使用一个void *指针:

typedef struct { 
    void *next; 
    void *data; 
} node; 

这同样适用于您的情况。

+0

**感谢Chris Lutz; **非常感谢,因为我刚刚读到'C'中的链接列表实现中,所以您的答案现在和以后都是现货:)要说*** StackOverflow * + C *编程:现代方法***必须是学习'C'的最佳方式。 – Dan 2011-04-25 03:41:49

5

在第二个示例中,名称MyStructType未在声明函数时定义。此外,你有*在错误的地方。你需要做类似如下的内容:

typedef struct MyStruct { 
    void (*myStructFunc)(struct MyStruct *); 
} MyStructType; 
+4

因为你的例子有效,所以你可以把'// <= parse error'去掉。 – 2011-04-25 03:29:17

+0

哎呀,谢谢。得到它了。 – 2011-04-25 03:31:01

+0

**感谢lacqui; **同时发现;给你+1,但与**克里斯**去了额外的信息。 – Dan 2011-04-25 03:43:12

2

尝试:

struct MyStructType { 
    void (*myStructFunc)(struct MyStructType*); 
}; 

代替。在C中,结构体在它们自己的命名空间中,所以如果你想引用一个结构体,你需要在struct前加上名字。你的typedef直到之后才被引用,这是一个错误。如果你还想要typedef,你可以这样做:

typedef MyStructType MyStructType_t;