2012-05-24 1 views
3

В C99, если x был объявлен ранее и типа v2, то я могу написать:C90 составные литералы

x = (v2) { 1, 2 }; 

где v2 является:

typedef struct { 
    int x; 
    int y; 
} v2; 

Могу ли я сделать что-то подобное в C90 ?

ответ

2

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}; 
1

Нет, это функция C99. Однако некоторые компиляторы позволят использовать его как расширение в режиме C89, например. НКА.

2

Ближайший вы можете получить в C90 без расширений компилятора будет:

{ 
    v2 temp = { 1, 2 }; 
    x = temp; 
} 

который можно сжать до одну строку или заменить макросом. (Так как C не имеет гигиенических макросов, однако, вы должны быть осторожны с макросами, которые декларируют переменные, конечно.)

 Смежные вопросы

  • Нет связанных вопросов^_^