2016-01-26 3 views
0

Я ищу способ инициализации структуры и вернуть этот указатель структуры в одну строку. (Портативный способ является лучшим, но для GCC, по крайней мере)Объявление структуры и указатель в одной строке

К примеру, я получил функцию:

void myfunc(const mystruct_t *ptr); 

Структура определения:

typedef struct mystruct_t{ 
    int field1; 
    const char *field2; 
}mystruct_t; 

я могу сделать:

const mystruct_t mystruct={.field1=23, .field2="myname" }; 
myfunc(&mystruct); 

У меня есть способ сделать это в одной строке?

что-то вроде:

myfunc(&{.field1=23, .field2="myname" }); 
+0

Я думаю, что синтаксис с точкой именования-инициализации, который вы используете, является расширением GCC в любом случае (поскольку вы упомянули о переносимости). – szczurcio

+0

Если вы хотите, чтобы они были в одной строке, просто поставьте их в одну строку. Если вы имеете в виду, что хотите использовать один и тот же «;», я считаю, что нет никакого способа, потому что вам нужно объявить объект, прежде чем получить его адрес. – Nik

+3

@szczurcio: Пожалуйста, обновите до 16-летней предыдущей версии стандарта C. Назначенные intialisers являются стандартными с C99. – Olaf

ответ

3

Вы можете использовать compound literal, поддерживаемую так C99.

myfunc(&(mystruct_t){.field1=23, .field2="myname" }); 
+0

Простое и очевидное решение, но я пробовал без успеха, но я просто попробую еще раз и подтвержу, что он работает. Большое спасибо всем – rom1nux

+0

С оригинальным оригиналом 'const mystruct_t mystruct = {. Field1 = 23, .field2 =" myname "}; myfunc (& mystruct); '' время жизни 'mystruct' продолжается до тех пор, пока объявленный блок не будет закрыт. Является ли этот составной литерал таким же? – chux

1

Использование compound literal (A GCC расширение до C99, который поддерживается в соответствии со стандартом, так как C99), что-то вроде

myfunc(&(mystruct_t){23, "myname"}); 

должно быть возможно.

+2

Компонентные литералы не являются расширением gcc больше с> 16 лет. Они являются стандартными с C99. – Olaf

+0

@ Олаф. Правильно, но мы не знаем об окружающей среде OP, не так ли? :) –

+1

5 Это не вопрос среды, а реализация языка, предоставляемая компилятором. Как всегда, без какого-либо древнего компилятора мы должны принять стандарт C, который является C11 вообще, но поскольку в этой области не было соответствующих изменений, C99 также будет приемлемым. Если OP использует gcc уже, он также может использовать режим C11 (или C99), который может быть меньшей «проблемой», чем использование расширений. (Он также гораздо более переносимый.) – Olaf

0

В C++ вы могли бы сделать это через конструктор, но с C99 составным литералом - это то, что вам нужно.

ПРИМЕЧАНИЕ: Я знаю, что он помечен как C. Это просто еще одна альтернатива, которую я хочу дать.

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