Почему присвоение имени перечислению значения IN вызывает синтаксическую ошибку? - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть класс с перечислением для единиц длины.

class LengthUnit
{
public:
    enum Value
    {
        IN,
        CM,
        FT
    };
    static double convert(double value, Value from, Value to){
        if (from == to) return value;
        return value * getScale(from)/getScale(to);
    }
    constexpr LengthUnit(Value value) : value(value) {}

    bool operator==(LengthUnit lUnit) const { return value == lUnit.value; }
    bool operator!=(LengthUnit lUnit) const { return value != lUnit.value; }

private:
    static double getScale(Value value){
        switch (value){
        case IN: return 2.54; // 1 in = 2.54 cm
        case FT: return 30.48; // 1 ft = 30.48 cm
        case CM: return 1;
        default:
            throw QException();
        }
    }
    Value value;
};

В 6-й строке обнаружена ошибка.

error: expected identifier before ',' token
         IN,
           ^

Если я изменю имя переменнойОт IN до INCHES ошибка исчезает.

Что вызывает эту ошибку?Насколько я могу судить, IN не является ключевым словом C ++ или Qt, так почему имя вызывает проблему?

1 Ответ

0 голосов
/ 13 февраля 2019

Вы не указали, какие другие заголовочные файлы вы используете, поэтому на самом деле невозможно дать какой-либо однозначный ответ.

Однако есть несколько вещей, которые вы можете сделать, чтобы разрешить конфликт имен:

  • Поскольку явно что-то еще определяет макрос препроцессора IN, вы можете сделать: #define IN whatever после всех ваших #include s, чтобы увидеть,компилятор сгенерирует сообщение об ошибке, описывающее, где еще оно было определено.

  • Если это не сработает, вы можете заставить компилятор генерировать предварительно обработанные выходные данные (часто с помощью параметра командной строки, такого как-E).Затем вы можете проверить его, чтобы увидеть, что заменило IN, что может дать вам подсказку, откуда оно пришло.

  • В вашем источнике (.cpp или .cc), вы можете добавить #undef IN после всех ваших #include s, чтобы отменить определение более раннего экземпляра, так как вам, вероятно, не понадобится более раннее определение.(Однако, , а не , сделайте это в заголовочном файле. Это может привести к проблемам в будущем.)

  • Просто переименуйте свои константы.Как я уже упоминал в своем комментарии, имена всех заглавных букв должны использоваться для (и только для) макросов препроцессора, чтобы избежать конфликтов имен.К сожалению, эта практика была испорчена для именования констант в верхнем регистре, но я думаю, что иметь отдельное пространство имен для макросов препроцессора гораздо полезнее.

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