我正在开发一个代码库,我们有几种可配置的类型。其中一种类型是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位整数。然后还有可读代码的问题......: - )
答案 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而且没有强制转换。工作良好。看起来很奇怪虽然显式转换不会在隐式转换时编译。如果隐式转换根本不是一个转换,因为编译器将这两种类型视为相同的类型,人们会认为在进行显式转换时相同的推理会起作用...