作为另一个学习c的javascript开发人员,我正在尝试实现一个基本对象。
用户结构.h
#ifndef USERSTRUCT_H
#define USERSTRUCT_H
struct User {
int age;
int (* getAge)();
};
typedef struct User User;
int getAge(User);
User initUser(int);
#endif /* USERSTRUCT_H */
用户结构C
#include "./UserStruct.h"
int getAge(User this) {
return this.age;
}
User initUser(int age){
User user;
user.age = age;
user.getAge = getAge;
return user;
}
主C
#include <stdio.h>
#include <stdlib.h>
#include "./UserStruct.h"
int main(int argc, char** argv) {
User user = initUser(15); // sets age to 15..
user.age = 2222;
printf("%d\n",user.getAge(1234)); // note the int passing here..
printf("%d\n",user.age);
return (EXIT_SUCCESS);
}
问题!以下内容:
一。有人能解释一下userstruct定义中的语法吗?
2.getage希望传递一个
int (* getAge)();
给它,为什么传入一个User
呢?这尤其奇怪,因为getage的实现使用int
。虽然我确实知道如何修复它,但我仍然不确定为什么它的行为方式。(解决方案是将用户的指针传递到getage)
最佳答案
C不是面向对象的语言,因为它存在于对象之前,但是您的示例演示了它可以与对象一起使用。int (* getAge)()
是一个函数指针,该函数接受任何参数()
并返回int,以指定该函数不接受应定义的参数(void)
getage是一个类用户的“方法”,它需要一个对象实例,在对象语言中,语法是user.getAge()
,它隐式地将this
作为第一个参数传递,在c中是显式的:getAge(user)
。
问题是int可以用作指针,这意味着user.getAge(1234)
将使用1234
作为用户的地址,因此将第二个int字段作为函数getage的地址并跳到此地址。
关于c - 作为结构的成员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45369058/