结构之间的铸造?

时间:2008-11-06 08:33:02

标签: c

我正在开发一个代码库,我们有几种可配置的类型。其中一种类型是64位整数。当我们编译没有本机64位整数类型的平台时,我们使用类似于

的结构简单地表示64位整数
typedef struct {
    unsigned int hi, lo;
} int64;

为了使这种类型有用,所有常见操作都被定义为诸如

之类的函数
int64 int64_add(int64 x, int64 y);

在本机64位整数类型可用的平台上,这些操作看起来像

#define int64_add(x, y) ((x) + (y))

无论如何,关于这个问题。我正在实现一些关于时间的功能,我想用64位整数表示我的时间:

typedef int64 mytime;

我还希望int64类型的所有常用操作都可用于我的时间类型:

#define mytime_add(x, y) (mytime) int64_add((int64) (x), (int64) (y))

这个问题是在C语言中不允许mytime和int64类型之间的转换(据我所知,无论如何)。有没有办法做到这一点,而无需重新实现mytime类型的所有add,sub,mul,div等函数?

一个选项当然是永远不要执行mytime typedef,只需在我需要表示时间的地方使用int64。这个问题是我不确定我是否总是希望将时间表示为64位整数。然后还有可读代码的问题......: - )

5 个答案:

答案 0 :(得分:4)

因为您使用的是typedef,所以根本不需要演员表。 C中的Typedef不会创建不同的类型,只会创建另一种类型的别名。编译器不区分它们。只需将mytime_add函数写为:

#define mytime_add(x, y) int64_add((x), (y))

或者你的C编译器是否足以进行内联:

mytime mytime_add(mytime x, mytime y) { return int64_add(x, y); }

答案 1 :(得分:3)

你真的需要演员吗? gcc正在编译以下示例,没有任何抱怨:


typedef struct int64 int64;

struct int64
{
    unsigned int hi, lo;
};

typedef int64 mytime;

int64
add_int64(int64 a, int64 b)
{
    int64 c;
    /* I know that is wrong */
    c.hi = a.hi + b.hi;
    c.lo = a.lo + b.lo;

    return c;
}

int
main(void)
{
    mytime a = {1, 2};
    mytime b = {3, 4};
    mytime c;

    c = add_int64(a, b);

    return 0;
}

答案 2 :(得分:1)

你可以尝试:

#define mytime int64

而不是typedef。

看起来它会为您提供透明转换和您正在寻找的可维护性。

答案 3 :(得分:1)

看看stdint.h头文件。它包含int64_t,uint64_t等。这是标准和可移植的方式,您将避免实现数学函数的需要:)。

答案 4 :(得分:0)

是的,所以我使用的是typedef而且没有强制转换。工作良好。看起来很奇怪虽然显式转换不会在隐式转换时编译。如果隐式转换根本不是一个转换,因为编译器将这两种类型视为相同的类型,人们会认为在进行显式转换时相同的推理会起作用...