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

 
 
> Ошибка при использовании inline + setjmp(), Почему ругается gcc ?
arhiv6
сообщение May 16 2016, 14:20
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 633
Регистрация: 21-05-10
Из: Томск
Пользователь №: 57 423



Добрый день. Решил написать простой карусельный переключатель задач. Для переключения контекста хочу использовать нелокальные переходы (setjmp, longjmp). Чтобы исключить дублирование кода, хочу небольшой участок кода вынести в отдельную функцию. Разумеется, из-за setjmp() функция должна быть встраиваемой. В gcc для этого есть специальный атрибут always_inline.
Код
static inline void loadMainContext(void) __attribute__((always_inline));
void loadMainContext(void)
{
    ...
    if (!setjmp(task_context))
        longjmp(main_context, 1);
    ...
}

Но при попытке компиляции gcc ругается:
Цитата
error: function 'loadMainContext' can never be inlined because it uses setjmp

Для себя задачу пока решил использованием дефайнов, но хочется узнать: почему компилятор не даёт мне использовать setjmp() во встраиваемой функции? Компилятор GCC 4.9.2.

Сообщение отредактировал arhiv6 - May 16 2016, 14:27


--------------------
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
arhiv6
сообщение May 16 2016, 17:21
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 633
Регистрация: 21-05-10
Из: Томск
Пользователь №: 57 423



Но я не сохраняю результат выполнения. Место вызова - правильное: если я явно напишу в это месте setjmp(foo) - работает. Если я вставлю setjmp(foo) в это место с помощью define - работает. Если я вставлю setjmp(foo) в это место с помощью inline функции - не работатет (точнее компилятор просто не даст собрать). Хотя в последнем случае вместо вызова inline-функции компилятор должен (если я правильно понимаю) заменить вызов функции фактическим кодом из функции. Почему же он мне запрещает это сделать? Только лишь потому что так сказано в стандарте?



--------------------
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 25th August 2025 - 02:42
Рейтинг@Mail.ru


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