C相当于PythonNone类型
C equivalent of Python None type
是否有等同于PythonNone
类型的C数据类型?
我试图在互联网上搜索它,但我真的找不到任何东西。
谢谢,
Python 是动态类型的,因此您可以将变量名绑定到任何类型,例如字符串、数字或 NoneType
。由于 C 是 静态 类型的,变量被 锁定 到特定类型,但是没有什么能阻止你创建一个可以是任何类型的类型。
比如一个union,带有一个tag字段来表示类型,比如在下面的完整程序中。首先,允许您存储和 select 任何类型的标记和联合类型:
enum uberType { ETYP_NONE, ETYP_INT, ETYP_DOUBLE, ETYP_CHARPTR };
typedef struct {
enum uberType type;
union { int valInt; double valDouble; char *valCharPtr; };
} tUberType;
然后一些辅助函数将 uber-type 设置为特定类型的值:
void makeNone(tUberType *ut) {
ut->type = ETYP_NONE;
}
void makeInt(tUberType *ut, int val) {
ut->type = ETYP_INT;
ut->valInt = val;
}
void makeDouble(tUberType *ut, double val) {
ut->type = ETYP_DOUBLE;
ut->valDouble = val;
}
void makeCharPtr(tUberType *ut, char *val) {
ut->type = ETYP_CHARPTR;
ut->valCharPtr = val;
}
最后是一个测试工具,包括一个输出函数:
#include <stdio.h>
void evalUber(tUberType *ut, char *post) {
switch (ut->type) {
case ETYP_NONE:
printf("none:%s", post);
break;
case ETYP_INT:
printf("int:%d%s", ut->valInt, post);
break;
case ETYP_DOUBLE:
printf("double:%f%s", ut->valDouble, post);
break;
case ETYP_CHARPTR:
printf("charptr:%s%s", ut->valCharPtr, post);
break;
default:
printf("?%s", post);
break;
}
}
int main(void) {
tUberType x;
makeNone(&x); evalUber(&x, "\n");
makeInt(&x, 42); evalUber(&x, "\n");
makeDouble(&x, 3.14159); evalUber(&x, "\n");
return 0;
}
测试工具 main
的输出如预期的那样:
none:
int:42
double:3.141590
是否有等同于PythonNone
类型的C数据类型?
我试图在互联网上搜索它,但我真的找不到任何东西。
谢谢,
Python 是动态类型的,因此您可以将变量名绑定到任何类型,例如字符串、数字或 NoneType
。由于 C 是 静态 类型的,变量被 锁定 到特定类型,但是没有什么能阻止你创建一个可以是任何类型的类型。
比如一个union,带有一个tag字段来表示类型,比如在下面的完整程序中。首先,允许您存储和 select 任何类型的标记和联合类型:
enum uberType { ETYP_NONE, ETYP_INT, ETYP_DOUBLE, ETYP_CHARPTR };
typedef struct {
enum uberType type;
union { int valInt; double valDouble; char *valCharPtr; };
} tUberType;
然后一些辅助函数将 uber-type 设置为特定类型的值:
void makeNone(tUberType *ut) {
ut->type = ETYP_NONE;
}
void makeInt(tUberType *ut, int val) {
ut->type = ETYP_INT;
ut->valInt = val;
}
void makeDouble(tUberType *ut, double val) {
ut->type = ETYP_DOUBLE;
ut->valDouble = val;
}
void makeCharPtr(tUberType *ut, char *val) {
ut->type = ETYP_CHARPTR;
ut->valCharPtr = val;
}
最后是一个测试工具,包括一个输出函数:
#include <stdio.h>
void evalUber(tUberType *ut, char *post) {
switch (ut->type) {
case ETYP_NONE:
printf("none:%s", post);
break;
case ETYP_INT:
printf("int:%d%s", ut->valInt, post);
break;
case ETYP_DOUBLE:
printf("double:%f%s", ut->valDouble, post);
break;
case ETYP_CHARPTR:
printf("charptr:%s%s", ut->valCharPtr, post);
break;
default:
printf("?%s", post);
break;
}
}
int main(void) {
tUberType x;
makeNone(&x); evalUber(&x, "\n");
makeInt(&x, 42); evalUber(&x, "\n");
makeDouble(&x, 3.14159); evalUber(&x, "\n");
return 0;
}
测试工具 main
的输出如预期的那样:
none:
int:42
double:3.141590