C - >可以自己引用struct吗?

时间:2014-11-13 09:10:23

标签: c struct

我是一名java程序员并且是C style struct的新手,我有一个包含一个包含switch case的函数的结构:

typedef struct
{
 char name;
 void myFunction()
 {
  switch(?)
  {
   case "y": break;
   default:  break;
  }
 }
}AXIS;

我想知道我是否有办法让“?”传递给我的开关是AXIS.name,无论我指定什么名字。

例如,如果我有

AXIS Y={"y"} 

我希望Y.myFunction()调用案例y

感谢您对此事的任何帮助,谢谢。

2 个答案:

答案 0 :(得分:3)

您的代码有几个问题:

  • char name是单个字符,不是字符串。
  • 您不能在C中使用结构成员函数。
  • switch不使用字符串。

让我们先修复结构:

typedef struct
{
    char name[10]; // Maximum allowed string is 9 characters.
} AXIS;

然后功能:

void myFunction(AXIS * self) { // You need to pass the object pointer explicitly
    if(strcmp(self->name, "y") == 0) { // Compare string with strcmp
         // String was equal to "y"
    }
}

最后是电话:

int main(void) {
    AXIS y = {"y"};
    myFunction(&y); // Give address of an object to function
    return 0;
}

答案 1 :(得分:1)

如果你正在做C,只需在该结构中放置一个函数指针,并在初始化时设置正确的:

void function_y(){...}
void function_z(){...}

typedef struct{
  void (*myFunction)();
} AXIS;

AXIS a = {function_y};

如果名称随时间变化,请定义enum枚举所有可能的值name,而不是使用char。然后,您需要向myfunction添加一个参数,以便获取name中的值:

typedef enum {
  Y,
  Z
} AxisName;

typedef struct AXIS {
  AxisName name;
  void (*myFunction)(AXIS *);
} AXIS;

void AXISfunction(AXIS *axis){
   switch (axis->name){
     case Y:
     /*... */  
}

AXIS a = {Y,AXISfunction};

void foo(){
  a.myFunction(&a);
}

(这基本上是C中的穷人OOP)。

在C ++中,您可以遵循相同的原则(使用enum),但您不需要额外的参数,也不需要使用函数指针:

struct AXIS {
  AxisName name;
  void myFunction(){
      switch(name){
        case Y: //...
        //... 
      }
   }
};

当然,您可以使用继承和重载(如Java)来避免使用开关。