【问题标题】:C equivalent of Python None typeC 等价于 Python None 类型
【发布时间】:2020-06-25 00:43:28
【问题描述】:

是否存在与 Python None 类型等效的 C 数据类型?

我试图在互联网上搜索它,但我真的找不到任何东西。

谢谢,

【问题讨论】:

  • C 是静态类型的,所以“无”类型真的没有任何意义。有一种 'void' 类型,它实际上完全不是一回事。
  • 对于指针,始终为 NULL。对于 float 和 double,有 NaN。但是对于 int、short 和 long,没有可以分配的值,这意味着整数变量没有值 - 每个位序列都是一个有效数字。所以它并不适用于所有类型。
  • @JerryJeremiah FWIW,确实存在一些架构,其中整数类型可以具有称为trap representations 的“无效”值。除了基于unsigned char 的位模式和memcmp()/memset() 或类似的,检查或设置这些值可能会有些问题。

标签: c nonetype


【解决方案1】:

Python 是动态类型的,因此您可以将变量名称绑定到任何类型,例如字符串、数字或NoneType。由于 C 是静态类型的,变量被锁定到特定类型,但没有什么能阻止你创建一个可以是任何类型的类型。

例如,一个带有标签字段来表示类型的并集,比如下面的完整程序。首先,标签和联合类型允许您存储和选择任何类型:

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

【讨论】:

    猜你喜欢
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 2011-11-25
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    相关资源
    最近更新 更多