Pjotar 0 22 июня, 2009 Опубликовано 22 июня, 2009 · Жалоба Сделано по доке на WinAVR void main(void) __attribute__((noreturn)); void main(void) { //... } И вдруг появился warning: return type of 'main' is not 'int' Вроде как раньше не было... Что может быть не так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 16 22 июня, 2009 Опубликовано 22 июня, 2009 · Жалоба Я бы не обращал внимания. Скормите ему int, пусть успокоится. Какая разница, если всё равно noreturn Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pjotar 0 22 июня, 2009 Опубликовано 22 июня, 2009 · Жалоба Может быть есть способ отключить предупреждение? Никак не гуглиться, в доках тоже нету. Ниспошлите мне чего-нить вроде #pragma suppress_warning Кстати изменил на int int main( void ) __attribute__((noreturn)); int main( void ) { // ... // Здесь нет return!!! wdt_enable( 0 ); for (;;); } Но, как обычно, +4 байта + warning: function declared 'noreturn' has a 'return' statement Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 22 июня, 2009 Опубликовано 22 июня, 2009 · Жалоба Сделано по доке на WinAVR void main(void) __attribute__((noreturn)); void main(void) { //... } И вдруг появился Вроде как раньше не было... Что может быть не так? -Wno-main В C++ кажется не работает, но там проще объявить int и ничего не возвращать, что означает возврат 0. Предупреждений нет, а дальше атрибут работает. Да, в свежих avr-gcc для main можно давать атрибут OS_main Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 22 июня, 2009 Опубликовано 22 июня, 2009 · Жалоба avr-gcc (WinAVR 20090313) 4.3.2 Что-то странное происходит. Да с -Wno-main компилится без предупреждений на void main(void). Атрибуты noreturn и OS_main никак не сказываются на размер... Может я в танке:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 22 июня, 2009 Опубликовано 22 июня, 2009 · Жалоба Атрибуты noreturn и OS_main никак не сказываются на размер...Бывает, что это ничего н едаёт. Возможно, main() слишком проста, в том смысле, что в ней самой практически нет переменных и сложных вычислений. Если в ней вызывается несколько функций из этого же файла, которые static и вызываются один раз только из неё, то они могут инлайниться и при -Os, фактически main берёт на себя их потребности в регистрах и тогда на входе в main calleee-saved регистры сохраняются в стеке. noreturn/OS_main от этого лечат. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 22 июня, 2009 Опубликовано 22 июня, 2009 · Жалоба Бывает, что это ничего н едаёт. Возможно, main() слишком проста, в том смысле, что в ней самой практически нет переменных и сложных вычислений.Да это мой вариант. Нет никаких переменных и вычислений. Если в ней вызывается несколько функций из этого же файла, которые static и вызываются один раз только из неё, то они могут инлайниться и при -Os, фактически main берёт на себя их потребности в регистрах и тогда на входе в main calleee-saved регистры сохраняются в стеке. noreturn/OS_main от этого лечат.А вот куча функций инициализации и др. вызываются из _других_ модулей (они не static и не инлайнятся по-любому). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 24 июня, 2009 Опубликовано 24 июня, 2009 · Жалоба Посмотрел листинг и не понял зачем после main с атрибутом noreturn оставлять такой хвост? b0: f8 94 cli 000000b2 <__stop_program>: b2: ff cf rjmp .-2 ; 0xb2 <__stop_program> Ведь компилятор _проверяет_ чтобы функция с атрибутом noreturn _действительно_ не делала return. А с OS_main он такой проверки не делает... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться