C->;是否可以从自身引用结构?
我是一名java程序员,不熟悉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
typedef struct
{
char name;
void myFunction()
{
switch(?)
{
case "y": break;
default: break;
}
}
}AXIS;
我想知道是否有一种方法可以将“?”传递给我的交换机,即AXIS.name,用于我指定的任何名称
例如,如果我有
AXIS Y={"y"}
我想Y.myFunction()
调用caseY
非常感谢您在这件事上的帮助。您的代码有几个问题:
是单个字符,而不是字符串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]
,因为它可以表示为一个整数