LINUX.ORG.RU

Ищу нормальную инициализацию константных структур

 ,


1

3

Нужен аналог растовского:

#[derive(Debug)]
struct Data {
    a: i32,
    b: i32,
    c: i32,
    flag: bool,
}

fn main() {
    let d = Data {
        a: 1,
        b: 1,
        c: 1,
        flag: false,
    };
        
    println!("{:?}", d);   
}

То есть:

  1. Значение присваивают по имени.
  2. Структура иммутабельная, ака все поля const.
  3. Пропустить инициализацию поля нельзя - ошибка компиляции.

Примеры:

struct Data
{
    const int a;
    const int b;
    const int c;
    const bool flag;
};

Data d1 {.a = 1}; // компилятор вообще молчит
Data d2 {1}; // warning: missing field 'b' initializer, только одно проверят; легко ошибиться полем
qDebug() << d1.b; 
qDebug() << d2.b; 

Есть решения?

★★★★★

Последнее исправление: RazrFalcon (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

Как это относится к тому, что написал я?

asaw ★★★★★
()

Набросал по-быстрому свой «ПриветМир» плагин для GCC. Реализация довольно посредственная, и я уверен, что в коде сокрыто несметное количество багов, но может даже в текущем состоянии он будет кому-то полезен.

https://gist.github.com/goto-vlad/198ce62f2db622cfb0f69f22aeb0b6d6

struct Data
{
	const int a;
	const int b;
	const int c;
	const bool flag;
} __attribute__((warn_missing_init)); // специальный атрибут

int main(void)
{
	Data d1 = {.a = 1};
	Data d2 = {1};
	return 0;
}
g++ -fplugin='/путь/к/плагину/plugin.so' main.cpp

main.cpp:11:19: warning: missing field initializers (1 instead of 4)
  Data d1 = {.a = 1};
                   ^
main.cpp:12:14: warning: missing field initializers (1 instead of 4)
  Data d2 = {1};

Хотя, сообщения об ошибках могли быть и получше...

goto-vlad
()
Ответ на: комментарий от goto-vlad

Плагин компилятора? Эпично. Правда у меня сборка под 3-мя ОС и на маке вообще clang-ом собираю. Тянуть туда плагин - не вариант.

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

И что, на всех платформах нужно отлавливать неправильную инициализацию? Или достаточно ее поймать только в dev-среде?

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