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

__attribute__((noreturn))

Сделано по доке на WinAVR

void main(void) __attribute__((noreturn));
        
void main(void)
{
    //...
}

 

И вдруг появился

warning: return type of 'main' is not 'int'

Вроде как раньше не было... Что может быть не так?

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


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

Я бы не обращал внимания.

Скормите ему int, пусть успокоится.

Какая разница, если всё равно noreturn

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


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

Может быть есть способ отключить предупреждение? Никак не гуглиться, в доках тоже нету. Ниспошлите мне чего-нить вроде #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

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


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

Сделано по доке на WinAVR

void main(void) __attribute__((noreturn));
        
void main(void)
{
    //...
}

 

И вдруг появился

Вроде как раньше не было... Что может быть не так?

-Wno-main

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

 

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

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


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

avr-gcc (WinAVR 20090313) 4.3.2

Что-то странное происходит.

Да с -Wno-main компилится без предупреждений на void main(void).

Атрибуты noreturn и OS_main никак не сказываются на размер...

Может я в танке:)

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


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

Атрибуты noreturn и OS_main никак не сказываются на размер...
Бывает, что это ничего н едаёт. Возможно, main() слишком проста, в том смысле, что в ней самой практически нет переменных и сложных вычислений.

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

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


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

Бывает, что это ничего н едаёт. Возможно, main() слишком проста, в том смысле, что в ней самой практически нет переменных и сложных вычислений.
Да это мой вариант. Нет никаких переменных и вычислений.

 

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

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


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

Посмотрел листинг и не понял зачем после main с атрибутом noreturn оставлять такой хвост?

  b0:    f8 94           cli
000000b2 <__stop_program>:
  b2:    ff cf           rjmp    .-2    ; 0xb2 <__stop_program>

Ведь компилятор _проверяет_ чтобы функция с атрибутом noreturn _действительно_ не делала return.

А с OS_main он такой проверки не делает...

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


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

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

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

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

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

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

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

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

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

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