создать экземпляр в макросе #define

Вместо использования непрозрачности установите фоновый цвет с помощью rgba, где 'a' - уровень прозрачности.

Итак, вместо:

background-color: rgb(0,0,255); opacity: 0.5;

используйте

background-color: rgba(0,0,255,0.5);
0
задан clankill3r 16 January 2019 в 12:12
поделиться

4 ответа

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

Вы можете определить макрос следующим образом:

#define some_func(a) for(static auto f = create_foo(); some_func(a, f), false;)

Да, это будет работать. В стандартном C ++ предложение init цикла for может содержать объявление статической переменной. Таким образом, переменная будет инициализирована только один раз. Тогда «условие» - это фактический вызов some_func, за которым следует оператор запятой с false, поэтому функция выполняется только один раз при каждом входе в цикл for.

Адаптация вашего кода из Arduino к стандартному C ++ и симуляция четырех циклов привела к тому же результату, который вы хотели. Смотрите это в прямом эфире .


В качестве альтернативы, если вы хотите казаться немного менее загадочным (но с чего бы это?), вы можете выбрать следующее:

#define some_func(a) do {static auto f = create_foo(); some_func(a, f); } while(0)

То же самое на самом деле.


Хорошо, применение этого к вашей реальной проблеме требует чего-то другого:

#define debounce(a) [](int v){static Debounce d = create_debounce(); \
                              return debounce(d, v); }(a)

Это определяет и немедленно вызывает лямбду. Поскольку лямбда-выражение создает уникальный тип замыкания везде, где он появляется в программе, это создаст уникальный статический объект для каждого выражения, в которое вы пишете debounce(...). Альтернативой является специальное выражение оператора GCC. Но в отличие от лямбды, это расширение. Который вы можете или не можете использовать, YMMV.

0
ответ дан StoryTeller 16 January 2019 в 12:12
поделиться

Когда цикл запускается снова, экземпляры Foo создаются снова, они не восстанавливаются с предыдущего запуска.

Я подозреваю, что вы хотите использовать набор статических переменных. Или рефакторинг вашего кода для ясности.

Этот макрос не помогает вам в этом вопросе, не используйте его, используйте явные переменные, и тогда вы увидите время жизни объектов. Макрос является не частью компилятора, а препроцессором.

0
ответ дан Matthieu Brucher 16 January 2019 в 12:12
поделиться

Кроме того, что ваш макрос плохо сформирован, он бесполезен для того, что вы хотите, потому что вы вызываете create_foo при каждом вызове.

Вы можете использовать статические переменные:

void loop() {
    static Foo f1, f2;
    some_func(3, f1);
    some_func(40, f2);
}
0
ответ дан eerorika 16 January 2019 в 12:12
поделиться

Первое, что нужно отметить, это то, что ваше состояние является логическим. Это сэкономит вам несколько байтов оперативной памяти.

Следующее, на что следует обратить внимание, это то, что вы хотите игнорировать изменения на входе в течение определенного периода времени; это означает, что вам не нужно хранить «текущее» состояние; только последнее состояние ... которое в конечном итоге будет таким же. Это не может вас спасти, так как 2 логических значения и 1 логическое значение, скорее всего, будут занимать байт; но это дает компилятору шанс, и, самое главное, упрощает работу.

С этими 2 довольно незначительными улучшениями мы доберемся до более крупных. Не используйте макросы, если вы действительно не знаете, что делаете; и даже потом пересмотреть.

Пример кода Arduino имеет тенденцию предлагать их, потому что кто-то думал, что это облегчит изучение; но, честно говоря, они этого не делают. Они не являются функцией, и ваше использование этого действительно не делает то, что вы думаете, что делает. Arduino предлагает ограниченные способы отладки, так что вы не можете сказать, что ваше состояние ВСЕГДА будет высоким, потому что макроразложение таково:

int state = true; 
for(static auto d = create_debounce(); 
    debounce(d, val), 
    false;);
//New lines added for clarity.

Переместить его в функцию; пусть компилятор оптимизирует код, потому что он ВСЕГДА будет работать лучше, чем вы, если вы пишете код так, как это позволяет.

0
ответ дан UKMonkey 16 January 2019 в 12:12
поделиться
Другие вопросы по тегам:

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