В C99, если x
был объявлен ранее и типа v2
, то я могу написать:C90 составные литералы
x = (v2) { 1, 2 };
где v2
является:
typedef struct {
int x;
int y;
} v2;
Могу ли я сделать что-то подобное в C90 ?
В C99, если x
был объявлен ранее и типа v2
, то я могу написать:C90 составные литералы
x = (v2) { 1, 2 };
где v2
является:
typedef struct {
int x;
int y;
} v2;
Могу ли я сделать что-то подобное в C90 ?
AFAIK, составные литералы были введены точно в C99. Однако, если вы используете GCC, эта функция доступна как расширение. Цитирование GCC docs:
ISO C99 поддерживает сложные литералы. Комбинированный литерал выглядит как листинг, содержащий инициализатор. Его значение является объектом типа, указанного в листинге, содержащего элементы, указанные в инициализаторе; это значение lvalue. В качестве расширения GCC поддерживает сложные литералы в режиме C90 и в C++.
Еще одно замечание относительно этой особенности GCC:
В качестве расширения GNU, GCC позволяет инициализации объектов со статической продолжительностью хранения с помощью составных литералов (что невозможно в ISO C99, потому что инициализатор не константа). Он обрабатывается так, как если бы объект был инициализирован только с включенным списком скобок, если типы составного литерала и объекта совпадают. Список инициализаторов составного литерала должен быть постоянным. Если инициализированный объект имеет тип массива неизвестного размера, размер определяется размером составного литерала.
static struct foo x = (struct foo) {1, 'a', 'b'}; static int y[] = (int []) {1, 2, 3}; static int z[] = (int [3]) {1};
Приведенные выше строки эквивалентны следующему:
static struct foo x = {1, 'a', 'b'}; static int y[] = {1, 2, 3}; static int z[] = {1, 0, 0};
Нет, это функция C99. Однако некоторые компиляторы позволят использовать его как расширение в режиме C89, например. НКА.
Ближайший вы можете получить в C90 без расширений компилятора будет:
{
v2 temp = { 1, 2 };
x = temp;
}
который можно сжать до одну строку или заменить макросом. (Так как C не имеет гигиенических макросов, однако, вы должны быть осторожны с макросами, которые декларируют переменные, конечно.)