我是一名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
。
感谢您对此事的任何帮助,谢谢。
答案 0 :(得分:3)
您的代码有几个问题:
char name
是单个字符,不是字符串。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)来避免使用开关。