PARITY_NONE ключевое слово в C++ Windows?

Я пишу последовательную библиотеку, используя boost, и у меня есть enum:

enum parity_t { PARITY_NONE, PARITY_ODD, PARITY_EVEN };

Я получаю ошибки, такие как:

Ошибка 1, ошибка C2059: синтаксическая ошибка: '('

Я не мог понять, в чем проблема. Тогда мы с другом попробовали:

void PARITY_NONE();

И мы получили эти ошибки:

Ошибка 1 ошибка C2143: синтаксическая ошибка: отсутствует ")" перед "константой"

Ошибка 2, ошибка C2143: синтаксическая ошибка: отсутствует ';' перед "постоянным"

Ошибка 3 ошибка C2182: "СЛОВО": недопустимое использование типа "void"

Ошибка 4, ошибка C2059: синтаксическая ошибка: ')'

Я включаю Boost Asio, который я думаю, в том числе последовательный API Windows где-то. Это происходит только в Windows. Как обходной путь, я изменил свои имена перечисления. Однако я не могу найти что-либо связанное с этой проблемой в Интернете. Может ли кто-нибудь помочь нам понять это?

4 ответа

Решение

Это определено в winbase.h:

//
// Settable Stop and Parity bits.
//

#define STOPBITS_10       ((WORD)0x0001)
#define STOPBITS_15       ((WORD)0x0002)
#define STOPBITS_20       ((WORD)0x0004)
#define PARITY_NONE       ((WORD)0x0100)
#define PARITY_ODD        ((WORD)0x0200)
#define PARITY_EVEN       ((WORD)0x0400)
#define PARITY_MARK       ((WORD)0x0800)
#define PARITY_SPACE      ((WORD)0x1000)

#undef их до создания вашего перечисления.

Это определено в WinBase.h:

//
// Settable Stop and Parity bits.
//

#define STOPBITS_10       ((WORD)0x0001)
#define STOPBITS_15       ((WORD)0x0002)
#define STOPBITS_20       ((WORD)0x0004)
#define PARITY_NONE       ((WORD)0x0100)
#define PARITY_ODD        ((WORD)0x0200)
#define PARITY_EVEN       ((WORD)0x0400)
#define PARITY_MARK       ((WORD)0x0800)
#define PARITY_SPACE      ((WORD)0x1000)

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

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

#ifdef PARITY_NONE
#error Duplicate definition
#endif

Повторите для каждого значения в enum

Узнать, откуда исходит определение, немного сложнее. Если вам повезет, сработает следующее

  • Закомментируйте определение enum
  • Тип PARITY_NONE в методе
  • Щелкните правой кнопкой мыши и выберите "Перейти к определению"

Если вы нажмете CTRL + левый щелчок на свой атрибут в Visual Studio, вы увидите его.

Другие вопросы по тегам