LINUX.ORG.RU

Инициализация структуры в Си++


0

0

Не могу осилить как это сделать, подскажите.

Имею gcc (native 4.3.3, arm-linux-gcc 4.1.1). Пробовал их поочереди - результат один.

user@host:~/code/test-ARM$ cat ./main.cpp

struct ttt {

int a;

int b;

};

static struct ttt qqq = {

.a = 5,

.b = 6,

};

int main()

{

return 0;

}

user@host:~/code/test-ARM$ g++ main.cpp

main.cpp:7: error: expected primary-expression before '.' token

main.cpp:8: error: expected primary-expression before '.' token

user@host:~/code/test-ARM$

Что самое странное, на этой же машине этот же пример инициализации компилируется внутри модуля ядра без проблем.


в C++ нет таких инициализаторов, В Си - есть.

>>Что самое странное, на этой же машине этот же пример инициализации компилируется внутри модуля ядра без проблем.


потому что он на Си.

alex_custov ★★★★★
()
Ответ на: комментарий от alex_custov

Понятно. Ну а как нибудь выкрутиться можно? Читал хелп по расширениям gcc - там

Another syntax which has the same meaning, obsolete since GCC 2.5, is ‘fieldname:’, as shown here:

struct point p = { y: yvalue, x: xvalue };

И это у меня работает, хотя и не рекомендуется.

gogi
() автор топика
Ответ на: комментарий от klalafuda

Ни то ни другое не подходит. Мне структура нужна для хранения настроек программы. Один экземпляр структуры хранит настройки по-умолчанию, второй - рабочие. Пользователь при необходимости может частично сбросить настройки в дефолтные, поэтому и нужна константная структура с этими дефолтными настройками. Настроек много - поэтому обязательно нужно при инициализации обращаться к элементам структуры по имени. Конструктор с десятками параметров мне тоже создавать не хочется.

gogi
() автор топика
Ответ на: комментарий от gogi

Может вам стоит изменить подход к решению задачи, а не выдумывать проблему на пустом месте?

andreyu ★★★★★
()
Ответ на: комментарий от gogi

> Ни то ни другое не подходит. Мне структура нужна для хранения
> настроек программы. Один экземпляр структуры хранит настройки
> по-умолчанию, второй - рабочие. Пользователь при необходимости может
> частично сбросить настройки в дефолтные, поэтому и нужна константная
> структура с этими дефолтными настройками. Настроек много - поэтому
> обязательно нужно при инициализации обращаться к элементам структуры
> по имени. Конструктор с десятками параметров мне тоже создавать не
> хочется.

Можно попробовать что-то вроде этого:

class Defaults1 {};
class Defaults2 {};

struct foo {
        foo() : a(0), b(0) {}
        foo(Defaults1) : a(123), b(456) {}
        foo(Defaults2) : a(654), b(321) {}

        int a;
        int b;
};

const foo foo_defaults1(Defaults1);
const foo foo_defaults2(Defaults2);

foo foo_actual;

Deleted
()
Ответ на: комментарий от Deleted

2 mironov_ivan: Спасибо, Вы меня на мысль натолкнули.

gogi
() автор топика
Ответ на: комментарий от gogi

ну дык и на здоровье. Определи у структуры конструктор без аргументов, который будет устанавливать все параметры в нужные умолчальные значения, затем определи 2 экземпляра этой структуры, но первый экземпляр сделай константным, а у второго пускай поля будут меняться при работе программы. Все.

d_a ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.