Определение & quot; основного & quot; по указателю на функцию

В C ++ возможно ли, чтобы main определялся указателем функции? Например:

int f(int, char**) {
return 0;
}

int (*main)(int, char**) = &f;

Этот код правильно компилируется и связывается, но при запуске вызывает ошибку сегментации. Я полагаю, что это может быть потому, что он пытается выполнить значение указателя функции в виде кода.

Кроме того, если это невозможно в простом C ++, тогда это может быть достигнуто с помощью нестандартных функций gcc (возможно, каким-то образом изменив тип экспортируемого символа).

Наконец, если это невозможно сделать с помощью директив gcc, можно ли это сделать с помощью специального сценария компоновщика?

3

Решение

Пункт 3.6.1 / 1 стандарта C ++ гласит:

«Программа должна содержать глобальный функция называется основной, что является обозначенным началом программы «

Это делает объявление указателя недопустимым.

6

Другие решения

Я считаю, что то, что вы пытаетесь сделать, не возможно в C ++. Самое простое решение, которое я могу придумать, это просто позвонить f в вашем основном:

int f(int, char**) {
return 0;
}

int main(int argc, char** argv) {
return f(argc, argv);
}

Я также не могу представить сценарий, в котором вышеуказанное решение не подойдет.

4

Я не могу представить, почему вы хотели бы этого, но нет, это определенно невозможно с простым C ++.

Если вам действительно нужно что-то подобное, просто используйте указатель на функцию, который вы вызываете в качестве первой команды в main.

4

С GCC вы можете передать параметры компоновщику с помощью -Wl вариант. Тогда вы можете использовать --entry опция компоновщика, чтобы указать, какая функция должна быть вызвана первой.

ПРЕДУПРЕЖДЕНИЕ: Это будет не делай, что ожидаешь! Функция входа в программу на самом деле не main функция, но другая функция, которая устанавливает среду выполнения и затем позвони main функция.

2

Если вы на 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")));
2

Еще один «грязный» способ — создать фальшивую функцию с использованием ассемблера. & в качестве первой инструкции этой функции перейдите к 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;
}
0

main является ключевым словом в C, а также в C ++ и перезаписывается в качестве имени указателя функции в вашей программе. main определяет точку входа исполнения. Следовательно, ваша программа не имеет этой функции и перезаписывает main это segfaults.

0

int (* main) (int, char **) = е;

не выглядит правильно.

Как насчет

int (*main)(int, char**) = f;

?

0
По вопросам рекламы [email protected]