Получение оператора if для проверки определенного макроса - PullRequest
0 голосов
/ 14 января 2020

У меня есть if-else, где if должен проверить флаг и определен ли макрос. Я пришел с двумя решениями, но не уверен, какое из них использовать.

  • Будет ли разница во времени выполнения (или это устранит оптимизация компилятора)?
  • Может ли первое решение вызвать ошибки с else, когда флаг не определен (т.е. из-за строк, написанных выше или ниже кода примера)?

Дополнительно:

  • Существуют ли какие-либо общепринятые передовые практики, которые могут применяться в этой ситуации?

1

#ifdef FLAG_A
    if(flagB)
    {
        ...
    }
    else
#endif
    {
        ...
    }

2

#ifdef FLAG_A
    bool flagA = true;
#else
    bool flagA = false;
#endif

    if(flagA && flagB)
    {
        ...
    }
    else
    {
        ...
    }

1 Ответ

1 голос
/ 14 января 2020

Если переменная flagA находится в локальной области (и остается неизменной в этой области), то эти два будут скомпилированы, чтобы быть точно такими же (для большинства компиляторов, в не отладочной сборке) . Однако, если flagA является глобальным, вам нужно объявить его как 'constexpr' (что, вероятно, хорошая идея в другом случае!) .

Доказательство: https://godbolt.org/z/r9nra5

С точки зрения передового опыта, я уверен, что каждый скинется со своими предпочтениями, но я предпочитаю версию 1. Единственный вариант причина в том, что сразу становится ясно, что код в блоке #ifdef / #endif условно компилируется. Это может быть не сразу заметно при рассмотрении случая 2.

...