Перейти к содержанию
    

Целочисленные переменные в препроцессоре?

Собственно сабж. Есть ли возможность в препроцессоре завести переменную которая будет меняться на этапе работы препроцессора? По сути достаточно простого инкремента для автоматической иннициализации некоторых ячеек массива.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет. И яр тут ни при чём. Препроцессор у него вполне себе стандартный для языка Си.

Вы лучше подробнее опишите задачу. Может быть, что-то конструктивное удастся посоветовать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можешь поиграться с boost/preprocessor

 

#define X() 4

#define BOOST_PP_VALUE 1 + 2 + 3 + X()
#include BOOST_PP_ASSIGN_SLOT(1)

#undef X

BOOST_PP_SLOT(1) // expands to 10

 

 

BOOST_PP_COUNTER // 0

#include BOOST_PP_UPDATE_COUNTER()

BOOST_PP_COUNTER // 1

#include BOOST_PP_UPDATE_COUNTER()

BOOST_PP_COUNTER // 2

#include BOOST_PP_UPDATE_COUNTER()

BOOST_PP_COUNTER // 3

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

можно использовать

__LINE__

Попробовал. Даже вроде примерно то что надо...

Вот только IAR-отладчик начал вываливаться при запуске с фатальной ошибкой :( ...

 

Вы лучше подробнее опишите задачу. Может быть, что-то конструктивное удастся посоветовать.

Есть диспетчер задач. К каждой задаче индекс. Индекс - уникальная константа от 0 до ... Так вот хотелось бы перестать значение индекса для каждой задачи писать вручную - когда много, можно случайно индексы продублировать.

 

Можешь поиграться с boost/preprocessor

Чесно говоря не сильно понял как работает. Но насколько понял это дополнение для ++ . В чистом IAR Си оно заработает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть диспетчер задач. К каждой задаче индекс. Индекс - уникальная константа от 0 до ... Так вот хотелось бы перестать значение индекса для каждой задачи писать вручную - когда много, можно случайно индексы продублировать.

Для этого есть enum

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чесно говоря не сильно понял как работает. Но насколько понял это дополнение для ++ . В чистом IAR Си оно заработает?

буст - это сборная солянка с++ библиотек. Конкретно boost/preprocessor - это библиотека для препроцессора, в иар си работает.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть диспетчер задач. К каждой задаче индекс. Индекс - уникальная константа от 0 до ... Так вот хотелось бы перестать значение индекса для каждой задачи писать вручную - когда много, можно случайно индексы продублировать.

Можно воспользоваться свойством статических переменных. Написать функцию:

int num()
{
    static int N;
    return ++N;
}

И задавать в каждой инициализации вызов функции вместо указания значения вручную. Гарантировано будут выдаваться разные значения. Для оптимизации можно функцию определить прямо в c/cpp файле как static, тогда компилятор вообще получит возможность заменить вызовы на подстановку значений (зависит от интеллекта компилятора и степени оптимизации).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть диспетчер задач. К каждой задаче индекс. Индекс - уникальная константа от 0 до ... Так вот хотелось бы перестать значение индекса для каждой задачи писать вручную - когда много, можно случайно индексы продублировать.

Для этого достаточно иметь механизм автоматической проверки на дублирование. Например, в код инициализации задачи вставить проверку индекса на совпадение со списком уже инициализированных задач. Этот код завернуть в #ifndef NDEBUG ... #endif, чтобы в сборках типа Release этот код не генерился.

void task_init(int id)
{
#ifndef NDEBUG
    static long mask;
    assert(0 <= id && id < 8 * sizeof(mask));
    assert((mask & (1 << id)) == 0);
    mask |= (1 << id);
#endif
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть диспетчер задач. К каждой задаче индекс. Индекс - уникальная константа от 0 до ... Так вот хотелось бы перестать значение индекса для каждой задачи писать вручную - когда много, можно случайно индексы продублировать.

А Вы подробнее распишите, что за диспетчер, каков механизм запуска, находятся ли задачи исключительно в одном файле итд.

Если есть отдельно процедура запуска задачи, а не статически компилированные структуры, то подобные вопросы решаются прекрасно и с __LINE__ и с функцией num()

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно воспользоваться свойством статических переменных.

Переменные не подходят. Нужны именно константы. Т.е. индексы должны формироваться на этапе компиляции, а не уже при работе.

 

Для этого есть enum

Да, в этом что-то есть. Если получится автоматом сформировать enum, а потом его использовать в качестве индекса массивов - может оказаться наилучшим вариантом.

 

PS. Да, большое спасибо. Вариант с enum очень даже хорошо получился. Сильно упростил реализацию и избавил от С99 зависимости которая слегка напрягала.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...