Подтвердить что ты не робот

Есть ли элегантный способ заставить сравнить две константы?

Как мы все знаем, следующий код будет оптимизирован всеми разумными компиляторами:

const int a = 3;
const int b = 42;

if (a == b)
{
    do_something();
}

Если две константы одинаковы, то if опускается, и функция всегда вызывается, если они разные, весь блок опущен.

Однако могут быть ситуации, когда важно НЕ оптимизировать этот код, так как сама программа может быть изменена до ее запуска. Например. двоичный файл находится во флэш-памяти и может получить доступ к внешней программе, и, конечно же, адреса двух const фиксированы. (имеет смысл во встроенном).

Я думаю использовать #pragma, но это не является частью стандарта C.

Другой способ - использовать const volatile. Гарантируется ли работа над всеми стандартными компиляторами?

4b9b3361

Ответ 1

Да, const volatile int a = 3; выполняет именно то, что вы хотите, и соответствует стандартам, начиная с C89 (см. раздел 3.5.3 на C89).

Этот отличный ответ описывает const volatile в деталях, для использования в ситуации, аналогичной вашей.

Ответ 2

const volatile должен сделать трюк, потому что для сравнения требуется "чтение" двух переменных volatile, а стандарт гарантирует, что чтение будет рассматриваться как имеющее наблюдаемые побочные эффекты.

Поэтому их нельзя просто оптимизировать.

Я должен спросить: какая проблема вы пытаетесь решить, для чего требуется это решение? Объяснение проблемы может позволить нам предложить предложения и решения, которые вы, возможно, не рассмотрели, которые не потребуют такого рода обручи.