smk 0 2 октября, 2023 Опубликовано 2 октября, 2023 · Жалоба typedef enum { NO_BLINK = 0, BLINK = !NO_BLINK } cursor_mode; Вот это дает ошибку error: typedef redefinition with different types ('enum cursor_mode' vs 'enum cursor_mode'). Как можно это исправить? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 240 2 октября, 2023 Опубликовано 2 октября, 2023 · Жалоба 23 минуты назад, smk сказал: Вот это дает ошибку error: typedef redefinition with different types ('enum cursor_mode' vs 'enum cursor_mode'). Как можно это исправить? Спасибо. Удалить множественные определения этого enum. Если он объявлен в .h, то добавить в него (в начале и в конце): #ifndef ..._H #define ..._H ... #endif Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smk 0 2 октября, 2023 Опубликовано 2 октября, 2023 · Жалоба Спасибо. Помогло. Как-то сразу не увидел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Stepanov 9 2 октября, 2023 Опубликовано 2 октября, 2023 · Жалоба Однако для 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 2 октября, 2023 Опубликовано 2 октября, 2023 · Жалоба 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. А можно конкретнее? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 81 3 октября, 2023 Опубликовано 3 октября, 2023 · Жалоба 13 часов назад, smk сказал: NO_BLINK = 0, BLINK = !NO_BLINK Дело в том, что "не ноль" - это любое число, в том числе и отрицательное. А энумератор просит указывать именно определённое, конкретное число. Тут достаточно было обойтись без цифр, как советовали ниже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 3 октября, 2023 Опубликовано 3 октября, 2023 · Жалоба 32 минуты назад, EdgeAligned сказал: Дело в том, что "не ноль" - это любое число, в том числе и отрицательное. Дело в том, что результат оператора ! для нулевого аргумента четко определен в стандарте и это ровно единица типа int. 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 3 октября, 2023 Опубликовано 3 октября, 2023 · Жалоба 2 минуты назад, Сергей Борщ сказал: оператора ! Это вообще логический оператор. Из 0 в 1 получается через несколько приведений типов. Это называется "грязной лапой". А если речь про С++, то там вот так делают enum class cursor_mode : uint8_t { NO_BLINK=0, BLINK=1 }; 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться