C99: приведение двойного к структуре? - PullRequest
2 голосов
/ 25 июля 2011

В огромном (миллионы LOC) C-проекте я хочу расширить тип типа "double" в структуру, содержащую два типа double:

Теперь у меня есть

typedef double popular_type;
//... a lot (>1k) usage of the type in expressions like:
popular_type a;
a = (popular_type) some_double_variable;

Я хочу изменить определение популярного типа на

#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, чтобы мне не приходилось менять все назначения?

Ответы [ 2 ]

3 голосов
/ 25 июля 2011

К сожалению, это невозможно.

Если вы измените определение popular_type на

typedef struct {
  double orig_fiels;
  double additional_field;
} popular_type;

без изменения назначений, компилятор выдаст ошибку conversion to non-scalar type requested, поэтому ваш код выигралдаже не компилируется, и нет никакого обходного пути по этому.Единственный улучшенный скалярный тип выше double - это __float128, и вы не можете просто использовать дополнительные байты для хранения своих полей.

Вы действительно должны изменить назначения , к сожалению.

2 голосов
/ 25 июля 2011

Вам нужно будет изменить код - но сначала вам нужно будет точно решить, что вы хотите, чтобы код делал.

Результат преобразования double в версию popular_type это typedef'ed как double хорошо определено.В конце концов, они действительно одного типа.Но каков результат преобразования double в структуру?Учитывая double со значением 1,25, какими должны быть значения orig_field и additional_field в результирующей структуре?

Как только вы определились с семантикой, вы можете написать функцию (возможно,встроенный) или, возможно, макрос, который делает преобразование для вас.Вам все равно нужно будет изменить каждое преобразование, чтобы оно вызывало вашу новую функцию или макрос (и, возможно, некоторые назначения без приведения, поскольку при текущем определении приведение не требуется, как указывает @Sam Hoice).К счастью, компилятор скажет вам, где это нужно сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...