Я пытаюсь изучить более сложные аспекты C и написал это, когда экспериментировал с ключевым словом __inline__
:
#include <stdio.h>
void f(int);
void g(int);
__inline__ void f(int egg)
{
printf("f %d\n", egg);
g(egg);
}
__inline__ void g(int egg)
{
printf("g %d\n", egg);
f(egg);
}
int main()
{
f(123);
return 0;
}
Я перешел к руководствам по GNU и обнаружил, что опция компилятора -Winline
предупреждает, когда функцию, помеченную __inline__
, нельзя заменить.
Я действительно ожидал предупреждения, но я скомпилировал эту программу с gcc -ansi -pedantic -Wall -Wextra -Winline -o test test.c
, а предупреждений не было.
Когда я запускал программу, она распечатывала число целую кучу раз перед ошибкой сегментации, предположительно из-за превышения предела рекурсии.
У меня вопрос, как gcc
ведет себя в подобных случаях? Если он встроен в функции, как он узнает, что столкнулся с рекурсивным вызовом между двумя функциями?
Заранее спасибо