C->;是否可以从自身引用结构?

C->;是否可以从自身引用结构?,c,struct,C,Struct,我是一名java程序员,不熟悉C风格的结构,我有一个结构,其中包含一个包含开关盒的函数: typedef struct { char name; void myFunction() { switch(?) { case "y": break; default: break; } } }AXIS; 我想知道是否有一种方法可以将“?”传递给我的交换机,即AXIS.name,用于我指定的任何名称 例如,如果我有 AXIS Y={"y"} 我想Y.myFuncti

我是一名java程序员,不熟悉C风格的结构,我有一个结构,其中包含一个包含开关盒的函数:

typedef struct
{
 char name;
 void myFunction()
 {
  switch(?)
  {
   case "y": break;
   default:  break;
  }
 }
}AXIS;
我想知道是否有一种方法可以将“?”传递给我的交换机,即AXIS.name,用于我指定的任何名称

例如,如果我有

AXIS Y={"y"} 
我想
Y.myFunction()
调用case
Y


非常感谢您在这件事上的帮助。

您的代码有几个问题:

  • char name
    是单个字符,而不是字符串
  • 在C中不能有结构成员函数
  • 开关
    不适用于字符串
让我们首先修复结构:

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;
}

您的代码有几个问题:

  • char name
    是单个字符,而不是字符串
  • 在C中不能有结构成员函数
  • 开关
    不适用于字符串
让我们首先修复结构:

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;
}

如果您正在使用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++中,你可以遵循相同的原则(使用<代码>枚举< /COD>),但是不需要额外的参数,也不需要使用函数指针:

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

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

如果您使用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++中,你可以遵循相同的原则(使用<代码>枚举< /COD>),但是不需要额外的参数,也不需要使用函数指针:

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

<>当然可以使用继承和重载(比如java)避免使用开关。< /P>这不是C,也就是C++,或者可能是别的什么。是的,你可以做到,但是你必须给这个结构一个名字(例如,代码> TyPufFraseSox{}}轴;< /Cuth>)。是的,您可以为结构指定与类型别名相同的名称。虽然,C++没有必要构造结构的类型别名,因为它们本身是类型,所以<代码>结构轴{{}};代码>也同样有效。在C中不能使用带有
switch
的字符串。只能使用整数。如果您正在编写C,那么您应该扔掉当前正在阅读的教程或书籍,因为显然这不好。@user694733在他的情况下,尽管他可以像'abcd'一样切换大小写或
char[4]
,因为它可以表示为不是C的整数,即C++,或者可能是其他的东西。是的,你可以做到,但是你必须给这个结构一个名字(例如:代码> TyPufFraseStudio轴{}}轴;< /Cuth>)。是的,您可以为结构指定与类型别名相同的名称。虽然,C++没有必要构造结构的类型别名,因为它们本身是类型,所以<代码>结构轴{{}};代码>也同样有效。在C中不能使用带有
switch
的字符串。只能使用整数。如果您正在编写C,那么您应该扔掉当前正在阅读的教程或书籍,因为显然这不好。@user694733在他的情况下,尽管他可以像'abcd'一样切换大小写或
char[4]
,因为它可以表示为一个整数