作为另一个学习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/

10-10 16:54