1

我在下面列出了一些示例代码,问题是 function_name 是否有办法从 struct_name 访问 number 的值?

typedef struct struct_name {  
int number  
void (*func)();  
} * struct_name_ptr;  

void function_name() {  
//access number from struct  
}

main() {  
  struct_name_ptr newobject;  
  newobject->func=&function_name;  
  newobject->func(); //can it print the value of the number in the structure above?  
} 
4

5 回答 5

4

呃 - 不。

一个结构当然可以包含一个函数指针。但是您调用的函数对结构一无所知。除非您将指针作为函数参数传递,或者将结构设为全局。

于 2012-05-27T08:06:16.790 回答
1

您可以在纯 C 中“模拟”一个简单的 OOP,例如:

typedef struct {
int number;
void (*func)();
} class;

void function_name(class *this) {
  printf("%d",this->number);
}

#define CALL(c,f) c.f(&c)

int main() {
  class object={12345,function_name};

  CALL(object,func); // voilá
}
于 2012-05-27T11:51:00.457 回答
1

好吧,有两件事, struct_name->number 应该有一个值,它要么需要与 &function_name 在同一范围内,要么需要显式传递。有两种方法:

/* 这里是一个全局调用结构 */

#include<stdio.h>

typedef struct struct_name {
    int number;
    void (*func)();
    } * struct_name_ptr;

struct struct_name newobject = { 0 }; 

void function_name() {
    printf("%d",struct_name);
}

void main() {

    struct struct_name_ptr newobject;

    newobject->func=&function_name;
    newobject->func();
}

/* 一个修改了 function_name */

#include<stdio.h>

typedef struct struct_name {
    int number;
    void (*func)();
    } * struct_name_ptr;


void function_name(struct_name) {
    printf("%d",struct_name);
}

void main() {

    struct struct_name_ptr newobject;
    newobject.number = 0;

    newobject->func=&function_name;
    newobject->func(newobject);
}
于 2012-05-27T08:25:28.017 回答
1

不,披萨永远不会知道送披萨的披萨送货员长什么样。

常规函数只是内存中的一个地址。在这种情况下,可以使用函数指针调用它。无论如何:该函数不知道它是如何被调用的。特别是它不会知道它是使用函数指针调用的,该函数指针是某个结构(对应的一块内存)的一部分。

当使用像 C++ 这样的类语言时,成员函数将有一个隐藏参数,它是指向类实例的指针。这就是成员函数了解其数据的方式。

于 2012-05-27T09:00:24.740 回答
1

以我有限的编程知识,我认为这是不可能的。尽管该结构包含一个函数指针,但分配给它的函数的地址是不同的,我认为除非您将它作为参数传递,否则它无论如何都不会访问它。

于 2012-05-27T08:08:32.333 回答