В C ++ возможно ли, чтобы main определялся указателем функции? Например:
int f(int, char**) {
return 0;
}
int (*main)(int, char**) = &f;
Этот код правильно компилируется и связывается, но при запуске вызывает ошибку сегментации. Я полагаю, что это может быть потому, что он пытается выполнить значение указателя функции в виде кода.
Кроме того, если это невозможно в простом C ++, тогда это может быть достигнуто с помощью нестандартных функций gcc (возможно, каким-то образом изменив тип экспортируемого символа).
Наконец, если это невозможно сделать с помощью директив gcc, можно ли это сделать с помощью специального сценария компоновщика?
Пункт 3.6.1 / 1 стандарта C ++ гласит:
«Программа должна содержать глобальный функция называется основной, что является обозначенным началом программы «
Это делает объявление указателя недопустимым.
Я считаю, что то, что вы пытаетесь сделать, не возможно в C ++. Самое простое решение, которое я могу придумать, это просто позвонить f
в вашем основном:
int f(int, char**) {
return 0;
}
int main(int argc, char** argv) {
return f(argc, argv);
}
Я также не могу представить сценарий, в котором вышеуказанное решение не подойдет.
Я не могу представить, почему вы хотели бы этого, но нет, это определенно невозможно с простым C ++.
Если вам действительно нужно что-то подобное, просто используйте указатель на функцию, который вы вызываете в качестве первой команды в main.
С GCC вы можете передать параметры компоновщику с помощью -Wl
вариант. Тогда вы можете использовать --entry
опция компоновщика, чтобы указать, какая функция должна быть вызвана первой.
ПРЕДУПРЕЖДЕНИЕ: Это будет не делай, что ожидаешь! Функция входа в программу на самом деле не main
функция, но другая функция, которая устанавливает среду выполнения и затем позвони main
функция.
Если вы на Linux, & используя gcc, вы можете объявить main
как alias
для любой другой функции.
например, приведенный ниже код работает (по крайней мере, с gcc, не тестировался с g ++):
int f(int argc, char* argv[]) {
printf("hello world\n");
return 0;
}
int main(int argc, char* argv[]) __attribute__ ((alias("f")));
Еще один «грязный» способ — создать фальшивую функцию с использованием ассемблера. & в качестве первой инструкции этой функции перейдите к f
,
Ниже gcc
конкретный код для intel
цель:
asm(".globl main"); // main is not static
asm(".type main, @function"); // main is a 'function'
asm("main: jmp f"); // main starts here. jump to `f`
int g(){ //Some random function may be present in between "main" & "f"...
puts("hello universe");
}
int f(int argc, char* argv[]) {
int i;
puts("hello world");
printf("%d arguments given\n",argc - 1);
for(i=0;i<argc;i++) puts (argv[i]);
g();
return 0;
}
main
является ключевым словом в C, а также в C ++ и перезаписывается в качестве имени указателя функции в вашей программе. main определяет точку входа исполнения. Следовательно, ваша программа не имеет этой функции и перезаписывает main
это segfaults.
int (* main) (int, char **) = е;
не выглядит правильно.
Как насчет
int (*main)(int, char**) = f;
?