Как генерировать имена случайной переменной в C++ с помощью макросов?

Я думаю, что это решение легко

if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
  user_todat_latout = true;
} else {
  user_todat_latout = false;
}
17
задан freitass 4 July 2009 в 17:36
поделиться

5 ответов

Добавить M4 в процесс сборки? Этот макроязык имеет некоторые возможности с отслеживанием состояния и может успешно сочетаться с макросами CPP. Вероятно, это не стандартный способ создания уникальных имен в среде C, хотя я смог успешно использовать его таким образом.

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

Вы можете использовать __ FILE __ и __ LINE __ в расширении макроса, чтобы получить ту уникальность, к которой вы, кажется, стремитесь ... те метапеременные определяются в контексте исходного файла, поэтому будьте осторожны, чтобы убедиться, что вы получаете то, что ищете (например, опасность более чем одного макроса в одной строке).

12
ответ дан 30 November 2019 в 10:18
поделиться

Вместо того, чтобы препроцессор создавал имя, вы могли бы позволить пользователю макроса дать вам имя.

#define MY_MACRO(varname) int varname = getCurrentTime();
3
ответ дан 30 November 2019 в 10:18
поделиться

Создание уникальных имен в препроцессоре затруднено . Самое близкое, что вы можете сделать, - это преобразовать __ FILE __ и __ LINE __ в символ, как предлагает popcnt . Если вам действительно нужно сгенерировать уникальные глобальные имена символов, я бы последовал его совету об использовании вместо этого в вашей системе сборки чего-то вроде M4 или Perl-скрипта.

Возможно, вам не нужны уникальные имена. Если ваш макрос может накладывать новую область видимости, вы можете использовать то же имя, поскольку оно просто затеняет другие определения. Обычно я следую общему совету обертывания макросов в циклах do {...} while (0) . Это работает только для макросов, которые являются операторами, а не выражениями. Макрос может обновлять переменные, используя выходные параметры . Например:

#define CALC_TIME_SINCE(t0, OUT) do { \
     std::time_t _tNow = std::time(NULL); \
     (OUT) = _tNow - (t0); \
} while (0)

Если вы следуете нескольким правилам , вы обычно в большей безопасности:

  1. Используйте начальные подчеркивания или аналогичные соглашения об именах для символов, определенных в макросе. Это предотвратит возникновение проблем, связанных с параметром, использующим тот же символ.
  2. Используйте входные параметры только один раз и всегда заключайте их в круглые скобки. Это единственный способ заставить макросы работать с выражениями в качестве входных.
  3. Используйте идиому do {...} while (0) , чтобы гарантировать, что макрос используется только как оператор, и чтобы избежать другие проблемы с текстовой заменой.
8
ответ дан 30 November 2019 в 10:18
поделиться

Хотя я не думаю, что это вообще возможно, вам следует серьезно подумать о создании из этого класса.

Если вы хотите, чтобы случайный элемент в случайном массиве содержал определенное значение, вы можете сделать это:

std::vector< std::vector<int> > m_vec;

Затем оберните его в класс, чтобы разработчик мог установить только число:

void set(int foo)
{
    m_vec[random()][random()] = foo;
}

Есть ли причина, по которой вам нужен макрос? Случайное имя переменной звучит опасно, что, если она выбирает что-то, уже определенное где-то еще в коде?

-1
ответ дан 30 November 2019 в 10:18
поделиться

используйте __ COUNTER __ (работает на gcc4.8, clang 3.5 и Intel icc v13, MSVC 2015)

#define CONCAT_(x,y) x##y
#define CONCAT(x,y) CONCAT_(x,y)
#define uniquename static bool CONCAT(sb_, __COUNTER__) = false
11
ответ дан 30 November 2019 в 10:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: