[英]How to use #pragma startup with overloaded functions?
假設我有兩個重載函數:
fun1(int)
fun1()
在這種情況下,如何使用#pragma startup
指令通過fun1(int)
啟動程序的執行?
語法僅包含函數名稱:
#pragma startup fun1 100
有什么方法可以在這兩個功能之間做出選擇?
更新:
編譯器-Turbo C / C ++ 3.1(很抱歉舊的編譯器)
@ joey-rohan,我沒有borland,但嘗試提供以下代碼來演示:
#pragma start
需要一個未參數化的函數,函數調用后的數字是該函數的優先級,其中0最高,255最低。 理想情況下,應在#pragma
調用之前定義該函數(某些編譯器中有所不同)。 資料來源:embarcadero
我已經做了一些偵察,並認為解決你的困境的方法是使用#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 10
int main()
{
std::cout << "Hello World\n";
return 0;
}
我知道這並不像我希望的那樣優雅,因此它可能也不像您想要的那樣優雅,但是它確實允許您所需的功能,而只需進行最小的修改。 不幸的是我只有GCC可以在這台機器上進行測試而且它似乎不支持#pragma start
它確實支持不同的實現方式(如C語言構造函數和析構函數與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編譯器一起使用,但是如果沒有它,我就不能發誓了。
希望這可以幫助!
我既找不到您的編譯器上的任何文檔,也無法使用編譯器本身來檢查我的猜測。 但是從我記得的情況來看, #pragma startup
的功能不帶參數,並且返回void。
我將進一步猜測,如果僅保留帶有int
參數的函數,則您的代碼將無法正常工作。
忽略這一點,我認為不可能將參數傳遞給以這種方式調用的函數。
作為一個解決方案,我建議你創建包裝器函數,使用必要的參數調用你想要的任何函數,例如:
void start()
{
#pragma startup start
fun1( global_var_name );
}
我不完全確定我理解這些限制,但是如何簡單地定義另一個具有不同名稱的函數來轉發到你想要的函數呢?
void fun2() { fun1(42); }
#pragma startup fun2 100
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.