У меня есть функция, возвращающая тип union
. Разрешено ли стандартом (C99) доступ к полю возвращаемого значения непосредственно из вызова без копирования значения в переменную. Вот пример, чтобы проиллюстрировать, что я имею в виду:Можно ли получить доступ к полю возвращенного объединения без переменной?
union thinga { int integ; char arr[4]; };
union thinga f(void)
{
union thinga t = {.integ = 1};
return t;
}
int main(void)
{
printf("thinga is %d\n", f().integ);
}
Разрешен ли вызов с полем f().integ
? В моем примере это union
, но проблема такая же для struct
. Я задаю вопрос, потому что я живо помню, что gcc 3.3 на Solaris не понравилась эта конструкция и предупредила бы, как ад. Его проблема заключалась в том, что она должна была генерировать внутренне невидимую переменную, чтобы иметь возможность доступа к полю struct
или union
. Более новые компиляторы, похоже, не возражают против конструкции, но я хотел бы знать, есть ли скрытый улов (то есть undefined bevaviour
, о котором я не думал.
EDIT: Хорошо, похоже, что мой надуманный пример слишком прост, в качестве комментатора 2501 заметил, давая ссылки на массив распадающейся на указатель на из объектов области, давайте посмотрим, если мы находимся в той же ситуации, если я немного изменить свой код.
union thinga f(const char *val)
{
union thinga t = {.integ = 0};
t.arr[0] = val[0];
return t;
}
int main(void)
{
printf(" thinga.integ=%d .arr=%s\n", f("1").integ, f("1").arr);
}
этот случай такой же, как указано в arrays that are not lvalues and sequence point restriction и Undefined behavior: when attempting to access the result of function call? (Возвращаемое значение явно зависит от импментации (endiannes), но это не проблема здесь).
Очевидно, функция всегда возвращает 'int'. Так зачем использовать «союз»? – Olaf
Вы можете быть удивлены, если используете член 'arr': https://stackoverflow.com/questions/25759295/arrays-that-are-not-lvalues-and-sequence-point-restriction/25759612#25759612 Кажется, ub in C99: https://stackoverflow.com/questions/13755628/undefined-behavior-when-attempting-to-access-the-result-of-function-call/13755846#13755846 – 2501
Только надуманный пример для вопроса. В моем реальном проекте союз имеет 3 разных поля, к которым в разных модулях обращаются по-разному. Не было бы лишнего смысла в дополнении примера. –