Как использовать запуск #pragma с перегруженными функциями?

Предположим, у меня есть две перегруженные функции:

fun1(int)
fun1()

В этом случае, как я могу использовать #pragma startup директива начать выполнение моей программы с fun1(int) ?

Синтаксис содержит только имя функции:

#pragma startup fun1 100

Есть ли способ, которым я могу сделать выбор между этими двумя функциями?

ОБНОВИТЬ:

compiler- turbo c / c ++ 3.1 (извините за старый компилятор)

2

Решение

@ joey-rohan, у меня нет borland, но я попытался предоставить код ниже для демонстрации:

#pragma start требуется не параметризованная функция, число после вызова функции является приоритетом функции, где 0 — самое высокое, а 255 — самое низкое. В идеале, функция (в некоторых компиляторах меняется) должна быть определена до #pragma вызов. Источник: эмбаркадеро

Я немного разведал и думаю, что решением вашей дилеммы будет использование смеси #define а также #pragma достичь того, что вы хотели бы сделать. Например что-то вроде:

#include <iostream>

#define myvalue 100
#define usemyvalue 0

void fun1(int passedInValue)
{
// carry out function here
std::cout << "I was passed the value:" << passedInValue << std::endl;
}
void fun1(void)
{
std::cout << "in fun1(void)\n";
std::cout << "Use my value = " << usemyvalue<< std::endl;
if (usemyvalue==1)
{
std::cout << "Using fun1(int) with a value!\n";
fun1((int)myvalue);  // remember to cast as an int here
}
else
{
//normal fun1()code here
std::cout << "No var passed!\n";
std::cout << "Running standard non parametrised code!\n";
}

}

#pragma start fun1 10int main()
{
std::cout << "Hello World\n";

return 0;
}

Я знаю, что это не так элегантно, как хотелось бы, поэтому, вероятно, оно не так элегантно, как вам бы хотелось, однако оно допускает необходимую вам функциональность с минимальными изменениями. К сожалению, у меня есть только GCC для тестирования на этой машине, и он не поддерживает #pragma start однако он поддерживает другой способ достижения того же (как показано на Конструкторы и деструкторы языка Си с GCC
Итак, вот некоторый код для GCC, который я мог бы протестировать, чтобы показать вам, как добиться того, что вы просите (потому что я не хотел бы использовать методологию, которая не может быть доказана):

#include <iostream>

#define myvalue 100
#define usemyvalue 1   // this is the control switch to determine which to use,
// if the value is 1 then will pass a variable, otherwise will use
// the fun1(void) function
void fun1 (void) __attribute__((constructor));void fun1(int passedInValue)
{
// carry out function here
std::cout << "I was passed the value:" << passedInValue << std::endl;
}
void fun1(void)
{
std::cout << "in fun1(void)\n";
std::cout << "Use my value = " << usemyvalue<< std::endl;
if (usemyvalue==1)
{
std::cout << "Using fun1(int) with a value!\n";
fun1((int)myvalue);  // remember to cast as an int here
}
else
{
//normal fun1()code here
std::cout << "No var passed!\n";
std::cout << "Running standard non parametrised code!\n";
}

}

#pragma startup fun1

int main()
{
std::cout << "now running main function.\n";
std::cout << "Hello World\n";
return 0;
}

Я подозреваю, что второй метод также будет работать с компилятором Borlands, но без доступа к нему я не могу поклясться в этом.

Надеюсь это поможет!

2

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

Это специфическая директива Borland, до сих пор также задокументировано. Он просто позволяет вам указать функцию, которая запускается до входа в функцию main (). Вы обычно используете его для функции инициализации. Это маленький лейкопластырь для печально известных «статический порядок инициализации фиаско«От этого страдают реализации на C и C ++. Не уверен, что это остановит кровотечение, поскольку необходимость выбора номера приоритета должна стать непрактичной, когда программа становится большой.

Anyhoo, ничего ты должен использовать в качестве замены main (). Хотя я подозреваю, что вы могли бы заставить его работать, если вы не вернетесь из функции и не вызовете exit (). Вы не можете использовать аргумент, конечно, нет ничего значащего, что ЭЛТ может пройти. Так что перегрузки тоже не могут работать. Палка с основной ().

3

Я не могу ни найти документацию по вашему компилятору, ни использовать сам компилятор, чтобы проверить мои предположения. Но из того, что я помню, #pragma startup принимает функцию без аргументов и возвращает void.

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

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

В качестве решения я бы предложил вам создать функцию-оболочку, вызывая любую функцию, которую вы хотите, с необходимыми аргументами, например:

void start()
{
#pragma startup start
fun1( global_var_name );
}
1

Я не совсем уверен, что понимаю ограничения, но как насчет простого определения другой функции с другим именем для пересылки в нужную функцию?

void fun2() { fun1(42); }

#pragma startup fun2 100
1
По вопросам рекламы [email protected]