Я думаю, что это решение легко
if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
user_todat_latout = true;
} else {
user_todat_latout = false;
}
Добавить M4 в процесс сборки? Этот макроязык имеет некоторые возможности с отслеживанием состояния и может успешно сочетаться с макросами CPP. Вероятно, это не стандартный способ создания уникальных имен в среде C, хотя я смог успешно использовать его таким образом.
Вероятно, вы не хотите, чтобы случайные имена, кстати, основывались на вашей позе ваш вопрос. Вам нужен уникальный .
Вы можете использовать __ FILE __
и __ LINE __
в расширении макроса, чтобы получить ту уникальность, к которой вы, кажется, стремитесь ... те метапеременные определяются в контексте исходного файла, поэтому будьте осторожны, чтобы убедиться, что вы получаете то, что ищете (например, опасность более чем одного макроса в одной строке).
Вместо того, чтобы препроцессор создавал имя, вы могли бы позволить пользователю макроса дать вам имя.
#define MY_MACRO(varname) int varname = getCurrentTime();
Создание уникальных имен в препроцессоре затруднено . Самое близкое, что вы можете сделать, - это преобразовать __ 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)
Если вы следуете нескольким правилам , вы обычно в большей безопасности:
do {...} while (0)
, чтобы гарантировать, что макрос используется только как оператор, и чтобы избежать другие проблемы с текстовой заменой. Хотя я не думаю, что это вообще возможно, вам следует серьезно подумать о создании из этого класса.
Если вы хотите, чтобы случайный элемент в случайном массиве содержал определенное значение, вы можете сделать это:
std::vector< std::vector<int> > m_vec;
Затем оберните его в класс, чтобы разработчик мог установить только число:
void set(int foo)
{
m_vec[random()][random()] = foo;
}
Есть ли причина, по которой вам нужен макрос? Случайное имя переменной звучит опасно, что, если она выбирает что-то, уже определенное где-то еще в коде?
используйте __ 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