#c
Хочу скомпилировать такой код: void function () { puts("Hello world"); } main = function; Местами он компилируется, но при выполнении падает с ошибкой, местами не компилируется: prog.c:5:1: error: initializer element is not computable at load time main = function; ^ Как сделать, чтобы такое скомпилировалась, запустилась и не упало хоть где-нибудь? http://ideone.com/BZMp2V - изменение void на int и добавление return 0 не помогает: int function () { puts("Hello world"); return 0; } main = function; На ideone программы 32-битные, так что с кастом указателя в неявный int тоже не связано.
Ответы
Ответ 1
Задание выполнено, сэр! #include#include void func () { puts("xa-xa-xa"); exit(0); } void *main = func; avp@wubu:hashcode$ gcc t.c --entry=func && ./a.out xa-xa-xa avp@wubu:hashcode$ Правда, пришлось добавить exit(). Без exit валится. Если посмотреть в gdb, (gdb) layout asm то func() завершается вот так 0x400535 pop %rbp │ 0x400536 retq │ Смотрим стек (gdb) si (gdb) p $sp $3 = (void *) 0x7fffffffde70 (gdb) p *(0x7fffffffde70) $5 = 1 (gdb) и видим тут лежит 1, а не нормальный адрес возврата Ответ 2
На каждую проблему найдётся свой #define: void function () { puts("Hello world"); } #define main static main #define function 0 main = function; int main() { function(); } Проверка выполнения.Ответ 3
Другой вариант: использовать вложенные функции (расширение gcc): void f() { void (*main)(); void function () { puts("Hello world"); } main = function; main(); } int main() { f(); }
Комментариев нет:
Отправить комментарий