在巨大的(毫秒的LOC)C项目中,我希望将“double”类型扩展为包含两个双精度的结构:
现在我有了
typedef double popular_type;
//... a lot (>1k) usage of the type in expressions like:
popular_type a;
a = (popular_type) some_double_variable;
我想将popular_type定义更改为
#ifdef SYNTHETIC_POPULAR_TYPE
typedef struct {
double orig_field;
double additional_field;
} popular_type;
#else
typedef double popular_type;
#endif
如果我不改变像
这样的表达式popular_type a;
a = (popular_type) some_double_variable;
到
popular_type a;
a.orig_field = some_double_variable;
程序会运作吗?
如何重新声明popular_type
,以便我不必更改所有作业?
答案 0 :(得分:3)
不幸的是,这是不可能的。
如果您将popular_type
定义更改为
typedef struct {
double orig_fiels;
double additional_field;
} popular_type;
在不更改赋值的情况下,编译器将抛出错误conversion to non-scalar type requested
,因此您的代码甚至无法编译,并且没有解决方法。 double
以上唯一优越的标量类型是__float128
,您不能只使用额外的字节来存储字段。
不幸的是,你真的必须更改作业。
答案 1 :(得分:2)
您需要更改代码 - 但首先,您需要确切地确定您希望代码执行的操作。
将double
转换为类型定义为popular_type
的{{1}}版本的结果已明确定义。毕竟,他们真的是同一类型。但是将double
转换为结构的结果是什么?如果double
的值为1.25,那么结果结构中double
和orig_field
的值应该是多少?
一旦确定了语义,就可以编写一个函数(可能是内联函数),也可以编写一个为您进行转换的宏。您仍然需要更改每个转换,因此它会调用您的新函数或宏(可能还有一些没有强制转换的赋值,因为使用当前定义时不需要强制转换,如@Sam Hoice指出的那样)。幸运的是,编译器会告诉你需要做什么。