Есть объединение:
union
{
char charr[sizeof(double) * 4];
struct
{
int def, min, max, step;
} i;
...
struct
{
const char *def;
const char **choices; /* NULL terminated array */
} c;
} info;
добавлена разметка — Кодт
Здравствуйте, Hard_Club, Вы писали:
H_C>Есть объединение:
H_C> union
H_C> {
H_C> char charr[sizeof(double) * 4];
H_C> struct
H_C> {
H_C> int def, min, max, step;
H_C> } i;
H_C>...
H_C> struct
H_C> {
H_C> const char *def;
H_C> const char **choices; /* NULL terminated array */
H_C> } c;
H_C> } info;
так вот, в linux C static массив данных объединений специализируется так:
{{.i = {def, min, max, step}, {.i = {def, min, max, step}}.
Как перенести этот код на Visual C (там нет поддержки этого стандарта)?
добавлена разметка — Кодт
Здравствуйте, Hard_Club, Вы писали:
H_C>так вот, в linux C static массив данных объединений специализируется так:
H_C>H_C>{{.i = {def, min, max, step}, {.i = {def, min, max, step}}.
H_C>
H_C>Как перенести этот код на Visual C (там нет поддержки этого стандарта)?
Это был C99, а VC умеет только C90.
Очень просто: при агрегатной инициализации объединения — инициализируется первый член.
Поэтому, если не предполагается инициализировать строками, а только def,min,max,step, — достаточно переписать объявление структуры
union
{
struct { int def,min,max,step } i;
char charr[4*sizeof(int)];
}
Кстати!!! В исходном коде было [4*sizeof(double)], то есть, либо заточено под sizeof(double)==sizeof(int), либо вдвое больше.
Это опечатка или так задумано?
К>Это был C99, а VC умеет только C90.
К>Очень просто: при агрегатной инициализации объединения — инициализируется первый член.
К>Поэтому, если не предполагается инициализировать строками, а только def,min,max,step, — достаточно переписать объявление структуры
К>К>union
К>{
К> struct { int def,min,max,step } i;
К> char charr[4*sizeof(int)];
К>}
К>
К>Кстати!!! В исходном коде было [4*sizeof(double)], то есть, либо заточено под sizeof(double)==sizeof(int), либо вдвое больше.
К>Это опечатка или так задумано?
Дело в том, что объединение имеет такой вид:
union
{
char charr[sizeof(double) * 4];
struct
{
int def, min, max, step;
} i;
struct
{
double def, min, max, step;
} d;
struct
{
const char *def;
const char *accept_fmt;
const char *deny_fmt;
} s;
struct
{
int def;
const char *false_str;
const char *true_str;
} b;
struct
{
const char *def;
const char **choices; /* NULL terminated array */
} c;
} info;
И во многих местах оно специализируется по разному с помощью этих макросов:
#define EDJE_EXTERNAL_PARAM_INFO_INT_FULL(name, def, min, max, step) \
{name, EDJE_EXTERNAL_PARAM_TYPE_INT, {.i = {def, min, max, step}}}
#define EDJE_EXTERNAL_PARAM_INFO_DOUBLE_FULL(name, def, min, max, step) \
{name, EDJE_EXTERNAL_PARAM_TYPE_DOUBLE, {.d = {def, min, max, step}}}
#define EDJE_EXTERNAL_PARAM_INFO_STRING_FULL(name, def, accept, deny) \
{name, EDJE_EXTERNAL_PARAM_TYPE_STRING, {.s = {def, accept, deny}}}
#define EDJE_EXTERNAL_PARAM_INFO_BOOL_FULL(name, def, false_str, true_str) \
{name, EDJE_EXTERNAL_PARAM_TYPE_BOOL, {.b = {def, false_str, true_str}}}
#define EDJE_EXTERNAL_PARAM_INFO_CHOICE_FULL(name, def, choices) \
{name, EDJE_EXTERNAL_PARAM_TYPE_CHOICE, {.c = {def, choices}}}
разметка!!! — Кодт
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Hard_Club, Вы писали:
H_C>>так вот, в linux C static массив данных объединений специализируется так:
H_C>>H_C>>{{.i = {def, min, max, step}, {.i = {def, min, max, step}}.
H_C>>
H_C>>Как перенести этот код на Visual C (там нет поддержки этого стандарта)?
К>Это был C99, а VC умеет только C90.
К>Очень просто: при агрегатной инициализации объединения — инициализируется первый член.
К>Поэтому, если не предполагается инициализировать строками, а только def,min,max,step, — достаточно переписать объявление структуры
Агрегатную инициализацию понимает Intel C++ compiler, который хорошо интегрируется в студию.
Только надо выставить галку C99.