Предположим, у меня есть две перегруженные функции:
fun1(int)
fun1()
В этом случае, как я могу использовать #pragma startup
директива начать выполнение моей программы с fun1(int)
?
Синтаксис содержит только имя функции:
#pragma startup fun1 100
Есть ли способ, которым я могу сделать выбор между этими двумя функциями?
ОБНОВИТЬ:
compiler- turbo c / c ++ 3.1 (извините за старый компилятор)
@ 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, но без доступа к нему я не могу поклясться в этом.
Надеюсь это поможет!
Это специфическая директива Borland, до сих пор также задокументировано. Он просто позволяет вам указать функцию, которая запускается до входа в функцию main (). Вы обычно используете его для функции инициализации. Это маленький лейкопластырь для печально известных «статический порядок инициализации фиаско«От этого страдают реализации на C и C ++. Не уверен, что это остановит кровотечение, поскольку необходимость выбора номера приоритета должна стать непрактичной, когда программа становится большой.
Anyhoo, ничего ты должен использовать в качестве замены main (). Хотя я подозреваю, что вы могли бы заставить его работать, если вы не вернетесь из функции и не вызовете exit (). Вы не можете использовать аргумент, конечно, нет ничего значащего, что ЭЛТ может пройти. Так что перегрузки тоже не могут работать. Палка с основной ().
Я не могу ни найти документацию по вашему компилятору, ни использовать сам компилятор, чтобы проверить мои предположения. Но из того, что я помню, #pragma startup
принимает функцию без аргументов и возвращает void.
Я также предположил бы, что ваш код не будет работать, если вы оставите только функцию, принимающую int
аргумент.
Несмотря на это, я думаю, что невозможно передать аргумент функции, вызываемой таким образом.
В качестве решения я бы предложил вам создать функцию-оболочку, вызывая любую функцию, которую вы хотите, с необходимыми аргументами, например:
void start()
{
#pragma startup start
fun1( global_var_name );
}
Я не совсем уверен, что понимаю ограничения, но как насчет простого определения другой функции с другим именем для пересылки в нужную функцию?
void fun2() { fun1(42); }
#pragma startup fun2 100