Вопрос по warning:

Пожалуй, подниму тему.

Внезапно наткнулся на странные предупреждения. Например, в этом скетче (пример к моей же библиотеке)

Получаю вот такую красоту:

Спойлер
/mnt/B6F0D77CF0D74173/_Documents/Vladimir/YandexDisk/Arduino/libraries/shButton/shButton.h:52:7: warning: type 'struct shButton' violates the C++ One Definition Rule [-Wodr]
 class shButton
       ^
/mnt/B6F0D77CF0D74173/_Documents/Vladimir/YandexDisk/Arduino/libraries/shButton/shButton.h:52:7: note: a different type is defined in another translation unit
 class shButton
       ^
/mnt/B6F0D77CF0D74173/_Documents/Vladimir/YandexDisk/Arduino/libraries/shButton/shButton.h:88:22: note: the first difference of corresponding definitions is field 'btn_flag'
   uint8_t btn_flag = 0;
                      ^
/mnt/B6F0D77CF0D74173/_Documents/Vladimir/YandexDisk/Arduino/libraries/shButton/shButton.h:52:7: note: a type with different number of fields is defined in another translation unit
 class shButton
       ^
/mnt/B6F0D77CF0D74173/_Documents/Vladimir/YandexDisk/Arduino/libraries/shButton/shButton.h:191:8: warning: 'setVirtualClickOn' violates the C++ One Definition Rule  [-Wodr]
   void setVirtualClickOn(bool virtualclick_on = true);
        ^
/mnt/B6F0D77CF0D74173/_Documents/Vladimir/YandexDisk/Arduino/libraries/shButton/shButton.cpp:189:6: note: implicit this pointer type mismatch
 void shButton::setVirtualClickOn(bool virtualclick_on)
      ^
/mnt/B6F0D77CF0D74173/_Documents/Vladimir/YandexDisk/Arduino/libraries/shButton/shButton.h:52:7: note: type 'struct shButton' itself violates the C++ One Definition Rule
 class shButton
       ^
/mnt/B6F0D77CF0D74173/_Documents/Vladimir/YandexDisk/Arduino/libraries/shButton/shButton.cpp:189:6: note: 'setVirtualClickOn' was previously declared here
 void shButton::setVirtualClickOn(bool virtualclick_on)
      ^
/mnt/B6F0D77CF0D74173/_Documents/Vladimir/YandexDisk/Arduino/libraries/shButton/shButton.cpp:189:6: note: code may be misoptimized unless -fno-strict-aliasing is used
/mnt/B6F0D77CF0D74173/_Documents/Vladimir/YandexDisk/Arduino/libraries/shButton/shButton.h:198:8: warning: 'setLongClickMode' violates the C++ One Definition Rule  [-Wodr]
   void setLongClickMode(uint8_t longclickmode);
        ^
/mnt/B6F0D77CF0D74173/_Documents/Vladimir/YandexDisk/Arduino/libraries/shButton/shButton.cpp:194:6: note: implicit this pointer type mismatch
 void shButton::setLongClickMode(uint8_t longclickmode)
      ^
/mnt/B6F0D77CF0D74173/_Documents/Vladimir/YandexDisk/Arduino/libraries/shButton/shButton.h:52:7: note: type 'struct shButton' itself violates the C++ One Definition Rule
 class shButton
       ^
/mnt/B6F0D77CF0D74173/_Documents/Vladimir/YandexDisk/Arduino/libraries/shButton/shButton.cpp:194:6: note: 'setLongClickMode' was previously declared here
 void shButton::setLongClickMode(uint8_t longclickmode)
      ^
/mnt/B6F0D77CF0D74173/_Documents/Vladimir/YandexDisk/Arduino/libraries/shButton/shButton.cpp:194:6: note: code may be misoptimized unless -fno-strict-aliasing is used
/mnt/B6F0D77CF0D74173/_Documents/Vladimir/YandexDisk/Arduino/libraries/shButton/shButton.h:111:11: warning: 'getButtonState' violates the C++ One Definition Rule  [-Wodr]
   uint8_t getButtonState();
           ^
/mnt/B6F0D77CF0D74173/_Documents/Vladimir/YandexDisk/Arduino/libraries/shButton/shButton.cpp:120:9: note: implicit this pointer type mismatch
 uint8_t shButton::getButtonState()
         ^
/mnt/B6F0D77CF0D74173/_Documents/Vladimir/YandexDisk/Arduino/libraries/shButton/shButton.h:52:7: note: type 'struct shButton' itself violates the C++ One Definition Rule
 class shButton
       ^
/mnt/B6F0D77CF0D74173/_Documents/Vladimir/YandexDisk/Arduino/libraries/shButton/shButton.cpp:120:9: note: 'getButtonState' was previously declared here
 uint8_t shButton::getButtonState()
         ^
/mnt/B6F0D77CF0D74173/_Documents/Vladimir/YandexDisk/Arduino/libraries/shButton/shButton.cpp:120:9: note: code may be misoptimized unless -fno-strict-aliasing is used
/mnt/B6F0D77CF0D74173/_Documents/Vladimir/YandexDisk/Arduino/libraries/shButton/shButton.h:98:3: warning: '__comp_ctor ' violates the C++ One Definition Rule  [-Wodr]
   shButton(uint8_t pin, uint8_t inputtype = PULL_UP, uint8_t btntype = BTN_NO);
   ^
/home/vladimir/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-objcopy -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 /tmp/arduino_build_632476/UseButtonFlag.ino.elf /tmp/arduino_build_632476/UseButtonFlag.ino.eep/mnt/B6F0D77CF0D74173/_Documents/Vladimir/YandexDisk/Arduino/libraries/shButton/shButton.cpp:6:1: note: implicit this pointer type mismatch

 shButton::shButton(uint8_t pin, uint8_t inputtype, uint8_t btntype)
 ^
/mnt/B6F0D77CF0D74173/_Documents/Vladimir/YandexDisk/Arduino/libraries/shButton/shButton.h:52:7: note: type 'struct shButton' itself violates the C++ One Definition Rule
 class shButton
       ^
/mnt/B6F0D77CF0D74173/_Documents/Vladimir/YandexDisk/Arduino/libraries/shButton/shButton.cpp:6:1: note: '__comp_ctor ' was previously declared here
 shButton::shButton(uint8_t pin, uint8_t inputtype, uint8_t btntype)
 ^
/mnt/B6F0D77CF0D74173/_Documents/Vladimir/YandexDisk/Arduino/libraries/shButton/shButton.cpp:6:1: note: code may be misoptimized unless -fno-strict-aliasing is used

В других примерах к библиотеке ничего подобного нет, предупреждения начинают сыпать только если в скетче используется #define USE_BUTTON_FLAG

Что компилятор пытается мне донести?

Оно?

Что тебе без всех этих if defined мешало оставить все эти функции и переменную? Оно же всё равно если не используется - компилятором «выпилится»…

Оно. Только я в упор не вижу, где у меня там переопределения типов и тому подобного ))

Он не о том говорит, на сколько я понял…

#66 смотри.

Нет. С ним размер скетчей таки больше. Скетч, не использующий USE_BUTTON_FLAG

Сейчас:

Скетч использует 2878 байт (9%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 258 байт (12%) динамической памяти, оставляя 1790 байт для локальных переменных. Максимум: 2048 байт.

Если я делаю эти методы доступными без всяких флагов, то получается:

Скетч использует 2882 байт (9%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 259 байт (12%) динамической памяти, оставляя 1789 байт для локальных переменных. Максимум: 2048 байт.

Хотя они и не используются

Странно, это лучше Евгения Петровича подождать тогда и спросить у него - почему «не выпиливается»?

С другой стороны - 4 байта во флэш и 1 байт ОЗУ даже для attiny13 не сильно критично? Или это на каждую кнопку так?

Ну да, на каждый объект ))

Это всё потому, что не бывает ничего «универсального» :smiley: Всегда приходится чем-то жертвовать.

ЗЫ: Но вопрос про Почему «не выпиливается» - остаётся открытым.

В первую очередь строку №4 листинга

При компиляции у Вас компилируется два объектных файла. Один получен при компиляции фала .ino, а другой – при компиляции файла shButton.cpp.

В обоих объектных файла есть тип shButton. Причём, они (эти типы) существенно разные, т.к. в файле .ino определена константа USE_BUTTON_FLAG, а в файле shButton.cpp – нет. Разумеется, это приводит к разным вариантам типа shButton.

Вот он Вам и говорит, что, мол

Понятно?

1 лайк

Да. Примерно туда же и копал… Спасибо :raised_hand_with_fingers_splayed:

В общем, перенес все определения из файла shButton.cpp в конец файла shButton.h, сам файл shButton.cpp удалил, и ворнинги пропали. Вот ведь гадостный язык ))))

На брак с ворчливой женой похоже - терпишь и живешь…

3 лайка

Не понятно почему неиспользуемый код “не выпиливается”… (((

А кто Вам сказал, что он не выпиливается? Как Вы это определили?

@v258, а для чего Вы вообще стали использовать #if’ы в определении класса? У iarduino научились? Почему не пользоваться родными средствами ОПП? И проблем бы никаких не возникало. У Вас какие-то соображения были или просто не знаете как, и Вам надо показать?

Это не я сделал, а @v258

Если не трудно ))

Так разница всего 4 байта - как раз на входы таблицы методов. А сами методы выброшены.

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