簡體   English   中英

如何將#pragma啟動與重載功能一起使用?

[英]How to use #pragma startup with overloaded functions?

假設我有兩個重載函數:

fun1(int)
fun1()

在這種情況下,如何使用#pragma startup指令通過fun1(int)啟動程序的執行?

語法僅包含函數名稱:

#pragma startup fun1 100

有什么方法可以在這兩個功能之間做出選擇?

更新:

編譯器-Turbo C / C ++ 3.1(很抱歉舊的編譯器)

這是Borland專用的指令,也有文檔記錄 它只允許您指定在輸入main()函數之前運行的函數。 您通常將它用於初始化函數。 它是C和C ++實現所遭受的臭名昭着的“ 靜態初始化命令慘敗 ”的小型創可貼。 不太確定它會阻止流血,當程序變大時,不得不選擇優先級數應該變得不切實際。

Anyhoo,你不應該用它作為main()的替代品。 雖然我懷疑只要你不從函數返回並調用exit()就可以使它工作。 您當然不能使用參數,CRT可以通過沒有任何意義。 因此,重載也無法正常工作。 堅持使用main()。

@ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM