如何在 C 中创建用户定义的类型?

How create user-defined types in C?

出于未知原因,我需要知道如何将标准 char a[10]; 替换为 string a;(是的,我在 CS50 中看到过)。那么,如何创建自己的名为 string 的变量类型?

C 中的用户定义类型是结构、联合、枚举和函数。看来您还可以在列表中包含数组。

例如

struct Point
{
    int x;
    int y;
};

enum Dimension { N = 100 };
Point a[N];

在此示例中,数组类型为 Point[N]

事实上任何派生类型(包括指针)都可以被认为是用户自定义类型。 C 标准没有定义和使用 tern 用户定义类型。

用户定义的类型是以下之一:structunionenum。例如,struct:

struct worker {
  int id;
  char firstName[255];
  char lastName[255];
};

创建实例:

struct worker w1 = { 1234, "John", "Smith" };

就像typedef char string[10];一样简单。

但请不要这样做。 在 typedef 后面隐藏数组或指针是非常糟糕的做法。代码变得更难阅读,你从中一无所获。请参阅 Is it a good idea to typedef pointers? - 相同的参数适用于数组。

将隐藏数组命名为 string 特别糟糕,因为这是 C++ 使用的准确拼写 std::string

请注意,CS50 是一门糟糕的课程,因为它教你如何做。 SO 社区厌倦了 "un-teaching" 本课程受害者的坏习惯。一般而言,远离有问题的 Internet 教程。

如果您想创建某种自定义字符串类型,正确且正确的方法是改用结构。

放大@Lundin 在他的回答中所说的内容:

C 很难学的原因之一——尤其是对于来自其他语言的学生来说——是 C 确实没有有第一个-class "string" 类型。尽管它们很重要,但 C 中的字符串是由 char 的数组拼凑在一起的,并且通常通过 char * 指针访问。拼凑是由编译器、程序员和库函数(如 strcpyprintf.

之间的松散协作执行的

虽然我说的是"strings are cobbled together out of arrays of char, and often accessed via char * pointers",但这不是表示C的字符串类型是char [],也不表示C的字符串类型是 char *.

如果您想象 C 有一个 first-class 字符串类型,就像 charintdouble 一样由语言自动为您处理,你会非常困惑和沮丧。如果您尝试给自己一个名为 string 的 typedef,这将 not 将您从混乱中隔离开来,not 会缓解您的挫败感, 不会 让您的生活更轻松。这只会使问题更加模糊。