foo2 вызывается при инициализации вашей программы, непосредственно перед main () .
Редактировать: это неправильно ! Я предположил, что так работает статическая инициализация. Но в этом случае они вызываются один раз в начале функции.
Должно работать со статическим логическим значением. Ага. По крайней мере, в gcc это:
int test2()
{
static int bla = test();
}
Компилируется в:
8048616: b8 30 a0 04 08 mov $0x804a030,%eax
804861b: 0f b6 00 movzbl (%eax),%eax
804861e: 84 c0 test %al,%al
8048620: 75 52 jne 8048674 <_Z5test2v+0x67>
...
804863c: e8 b3 ff ff ff call 80485f4 <_Z4testv>
...
8048674: 83 c4 1c add $0x1c,%esp
8048677: 5b pop %ebx
8048678: 5e pop %esi
8048679: 5f pop %edi
804867a: 5d pop %ebp
804867b: c3 ret
Таким образом, он использует скрытый логический тип функции ($ 0x804a030) + некоторую магию для защиты от исключений и несколько потоков, вызывающих его одновременно.