#ifdef в баге оператора switch? - PullRequest
0 голосов
/ 20 января 2009

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

someFunc(value)
{

    switch(value){
        case 1:
        case 2:
        case 3:
#ifdef SOMEMACRO
        case 4:
        case 5:
#endif
           return TRUE;
    }
return FALSE;
}

SOMEMACRO определен, и допустим, значение равно 4. Почему пропускаются случаи 4 и 5, а вместо этого возвращается FALSE? (

Это потому, что у меня нет регистра по умолчанию или мне не разрешено использовать ifdef в операторе switch?

Ответы [ 9 ]

8 голосов
/ 20 января 2009

Попробуйте следующее:

someFunc(value)
{
  switch(value){
    case 1:
    case 2:
    case 3:
#ifdef SOMEMACRO
#error macro is defined
    case 4:
    case 5:
#else
#error macro is not defined
#endif
       return TRUE;
  }
  return FALSE;
}

Скомпилируйте это и посмотрите, какую из двух ошибок вам выдаст компилятор.

3 голосов
/ 20 января 2009

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

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

    someFunc(value)
    {
        switch(value){
            case 1:
            case 2:
            case 3:
                return TRUE;
#ifdef SOMEMACRO
            // Special build for SOMEMACRO Inc.
            case 4:
            case 5:
                return TRUE;
#endif
            default:
                return FALSE;
        }
    }
2 голосов
/ 20 января 2009

«выключатель» не сломан

до, более или менее, цитаты Прагматичный программист .

Идите и найдите в другом месте ошибку. Чтобы убедить себя, добавьте value = 4 и #define SOMEMACRO прямо в someFunc.

Создайте чистую сборку, чтобы убедиться, что каждая зависимость разрешена.

2 голосов
/ 20 января 2009

В зависимости от вашего компилятора, у вас должен быть способ прочитать и проверить предварительно обработанный код. Таким образом, вы освобождаетесь от необходимости угадывать и тыкать в это на расстоянии и можете видеть точный код, который вы просите компилятору компилировать. С gcc соответствующая опция -E .

1 голос
/ 20 января 2009

Вы уверены, что ваш модуль скомпилирован после того, как вы определили SOMEMACRO?

0 голосов
/ 20 января 2009

Как и другие, я думаю, что одно из ваших предположений должно быть неверным. Вы не говорите, какой компилятор вы используете, но если это MS Visual C ++, попробуйте поместить следующее в ваш #ifdef, чтобы убедиться, что SOMEMACRO действительно определено .

#ifdef SOMEMACRO

#pragma message("SOMEMACRO is defined")

    case 4:
    case 5:


#endif
0 голосов
/ 20 января 2009

Другие уже указали, как проверить, определен макрос или нет.

Если макрос определяется вашей системой сборки, хороший способ выяснить это будет; направить выходные данные сборки в grep (или аналогичный инструмент поиска текста) для поиска определения макроса (что-то вроде: make | grep "-DSOMEMACRO").

Если у вас нет grep в вашей системе; перенаправить вывод сборки в файл и открыть его в текстовом редакторе, чтобы проверить вручную с помощью текстового поиска.)

0 голосов
/ 20 января 2009

Что-то в ваших предположениях не соответствует действительности, измените код следующим образом и работайте в обратном направлении.

#define SOMEMACRO 1

someFunc(value)
{

    value = 4;

    switch(value){
        case 1:
        case 2:
        case 3:
#ifdef SOMEMACRO
        case 4:
        case 5:
#endif
           return TRUE;
    }
return FALSE;
}

Если это не вернет истину, у вас есть реальные проблемы.

0 голосов
/ 20 января 2009

Почему бы не поставить "возврат false" в случае по умолчанию?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...