реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> __attribute__((noreturn))
Злодей
сообщение Jun 22 2009, 07:08
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 29-04-08
Из: Петербург
Пользователь №: 37 142



Сделано по доке на WinAVR
Код
void main(void) __attribute__((noreturn));
        
void main(void)
{
    //...
}


И вдруг появился
Цитата
warning: return type of 'main' is not 'int'

Вроде как раньше не было... Что может быть не так?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jun 22 2009, 07:13
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Я бы не обращал внимания.
Скормите ему int, пусть успокоится.
Какая разница, если всё равно noreturn


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Злодей
сообщение Jun 22 2009, 07:36
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 29-04-08
Из: Петербург
Пользователь №: 37 142



Может быть есть способ отключить предупреждение? Никак не гуглиться, в доках тоже нету. Ниспошлите мне чего-нить вроде #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
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jun 22 2009, 09:00
Сообщение #4


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Злодей @ Jun 22 2009, 10:08) *
Сделано по доке на WinAVR
Код
void main(void) __attribute__((noreturn));
        
void main(void)
{
    //...
}


И вдруг появился
Вроде как раньше не было... Что может быть не так?
-Wno-main
В C++ кажется не работает, но там проще объявить int и ничего не возвращать, что означает возврат 0. Предупреждений нет, а дальше атрибут работает.

Да, в свежих avr-gcc для main можно давать атрибут OS_main


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 22 2009, 15:03
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



avr-gcc (WinAVR 20090313) 4.3.2
Что-то странное происходит.
Да с -Wno-main компилится без предупреждений на void main(void).
Атрибуты noreturn и OS_main никак не сказываются на размер...
Может я в танкеsmile.gif


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jun 22 2009, 16:07
Сообщение #6


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(demiurg_spb @ Jun 22 2009, 18:03) *
Атрибуты noreturn и OS_main никак не сказываются на размер...
Бывает, что это ничего н едаёт. Возможно, main() слишком проста, в том смысле, что в ней самой практически нет переменных и сложных вычислений.
Если в ней вызывается несколько функций из этого же файла, которые static и вызываются один раз только из неё, то они могут инлайниться и при -Os, фактически main берёт на себя их потребности в регистрах и тогда на входе в main calleee-saved регистры сохраняются в стеке. noreturn/OS_main от этого лечат.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 22 2009, 16:22
Сообщение #7


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(ReAl @ Jun 22 2009, 20:07) *
Бывает, что это ничего н едаёт. Возможно, main() слишком проста, в том смысле, что в ней самой практически нет переменных и сложных вычислений.
Да это мой вариант. Нет никаких переменных и вычислений.

Цитата
Если в ней вызывается несколько функций из этого же файла, которые static и вызываются один раз только из неё, то они могут инлайниться и при -Os, фактически main берёт на себя их потребности в регистрах и тогда на входе в main calleee-saved регистры сохраняются в стеке. noreturn/OS_main от этого лечат.
А вот куча функций инициализации и др. вызываются из _других_ модулей (они не static и не инлайнятся по-любому).


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 24 2009, 10:44
Сообщение #8


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Посмотрел листинг и не понял зачем после main с атрибутом noreturn оставлять такой хвост?
Код
  b0:    f8 94           cli
000000b2 <__stop_program>:
  b2:    ff cf           rjmp    .-2    ; 0xb2 <__stop_program>
Ведь компилятор _проверяет_ чтобы функция с атрибутом noreturn _действительно_ не делала return.
А с OS_main он такой проверки не делает...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 22:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01397 секунд с 7
ELECTRONIX ©2004-2016