Перейти к содержанию
    

Ошибка typedef redefinition with different type. Как исправить?

 typedef enum {
	NO_BLINK = 0,
	BLINK = !NO_BLINK
} cursor_mode;

Вот это дает ошибку  error: typedef redefinition with different types ('enum cursor_mode' vs 'enum cursor_mode'). Как можно это исправить? Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 минуты назад, smk сказал:

Вот это дает ошибку  error: typedef redefinition with different types ('enum cursor_mode' vs 'enum cursor_mode'). Как можно это исправить? Спасибо.

Удалить множественные определения этого enum. Если он объявлен в .h, то добавить в него (в начале и в конце):

#ifndef ..._H
#define ..._H
...
#endif

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Однако для C++11 это работает, но не для С++98 и С++20.

И непонятно зачем так делать когда можно не придумывать проблемы на ровном месте, а сделать так:

 Это работает везде и одинаково. Ибо "By default, the value of the first enumerator is zero if it is implicitly defined. "

typedef enum {
	NO_BLINK,
	BLINK
} cursor_mode;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 минут назад, Stepanov сказал:

 Это работает везде и одинаково. Ибо "By default, the value of the first enumerator is zero if it is implicitly defined. "

Потому что явное указание (лично я) делаю в тех случаях, когда нужно использовать этот enum в качестве индекса массива или смещения в памяти.

Чтобы не было соблазна от балды добавлять или изменять значения этих enum-ов.

Нет инициализации - "обычные" несодержательные константы, есть - "будь внимателен, будущий я (программист)".

24 минуты назад, Stepanov сказал:

Однако для C++11 это работает, но не для С++98 и С++20.

А можно конкретнее?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 часов назад, smk сказал:
NO_BLINK = 0,
BLINK = !NO_BLINK

 

Дело в том, что "не ноль" - это любое число, в том числе и отрицательное. А энумератор просит указывать именно определённое, конкретное число. 

Тут достаточно было обойтись без цифр, как советовали ниже. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

32 минуты назад, EdgeAligned сказал:

Дело в том, что "не ноль" - это любое число, в том числе и отрицательное.

Дело в том, что результат оператора ! для нулевого аргумента четко определен в стандарте и это ровно единица типа int.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, Сергей Борщ сказал:

оператора !

Это вообще логический оператор. Из 0 в 1 получается через несколько приведений типов. Это называется "грязной лапой". 

А если речь про С++, то там вот так делают 

enum class cursor_mode : uint8_t { NO_BLINK=0, BLINK=1 };

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...