在 C 中定义转换为自定义数据类型的规则

Define rules for casting to custom datatypes in C

对于内置数据类型(例如 intfloat 等),有内置的 'rules' 用于转换:例如

int x, float y;
x = 3;
y = x;

将产生 y = 3.000000.

有什么方法可以为我自己的由 typedef 定义的数据类型定义自定义 'casting rules'?

假设我有一个结构 rational 表示一个有理数。我希望能够将 int 变量转换为 rational,这样分母字段设置为 1,分子等于初始值 int。 IE。如果我这样做:

typedef struct rational{int num; int denom;} rational;
int x, rational y;
x = 3;
y = x;

我想得到 y.num = 3y.denom = 1

是否可以定义任意函数来控制转换 to/from 用户定义数据类型时的行为?

否则,是否可以为结构成员的子集设置一个 'default' 值(以便在为该类型的变量赋值时可以选择跳过该成员,默认为设定值)?

与允许重载类型转换运算符和赋值运算符的 C++ 不同,C 不允许定义自己的转换或隐式转换。

您需要编写一个执行转换的函数。例如:

rational int_to_rational(int x)
{
    rational r = { x, 1 };
    return r;
}

For the built-in datatypes (e.g. int, float etc), there are built-in 'rules' for casting

不,没有。 “Casting”是类型转换运算符的作用,是一种类型转换。有一些转换是在没有转换的情况下执行的,但是没有转换运算符就没有执行转换。

Is there any way to define custom 'casting rules' for my own datatypes defined by typedefs

Typedef 只是类型的别名。它们与定义新类型无关。

如果您为提供自动转换的类型创建 typedef 别名,那么这些别名将同样适用于其类型通过 typedef 描述的对象和值。但就语言规范而言,只有在规范规定的地方才会有自动转换。一些 C 实现扩展了该集合——例如,提供整数和指针之间的自动转换——但是 我知道没有任何 C 实现允许正在编译的代码定义新的自动转换。 C++ 已经过去了。