如何将 #pragma 启动与重载函数一起使用



假设我有两个重载函数:

fun1(int)
fun1()

在这种情况下,如何使用#pragma startup指令以fun1(int)启动程序的执行?

语法仅包含函数名称:

#pragma startup fun1 100

有什么方法可以在这两个功能之间进行选择吗?

更新:

编译器 - 涡轮增压 C/C++ 3.1(抱歉使用旧编译器(

这是一个Borland特定的指令,仍然有记录。 它只允许您指定在输入 main(( 函数之前运行的函数。 您通常将其用于初始化函数。 它是C和C++实现遭受臭名昭著的"静态初始化顺序惨败"的小创可贴。 不太确定它能止血,当程序变大时,必须选择优先级数字应该变得不切实际。

Anyhoo,你不应该用任何东西来代替main((。 虽然我怀疑你可以让它工作,只要你不从函数返回并调用 exit((。 当然,您不能使用参数,CRT 可以通过没有任何有意义的内容。 所以过载也不起作用。 坚持使用 main((。

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

int main()
{
   std::cout << "Hello Worldn";
   return 0;
}

我知道这并不像我希望的那样优雅,因此它可能也没有您想要的那么优雅,但是它确实允许您需要的功能,只需最少的修改。 不幸的是,我只有 GCC 可用于在这台机器上进行测试,它似乎不支持#pragma start但它确实支持实现相同目标的不同方式(如 GCC 的 C 语言构造函数和析构函数所示所以这里有一些GCC的代码,我可以测试它,让你看到如何实现你的要求(因为我不想PST一个无法证明的方法(:

#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 Worldn"; 
    return 0;
}

怀疑第二种方法也适用于Borlands编译器,但是无法访问它,我不能发誓。

希望这有帮助!

我既找不到有关编译器的任何文档,也无法使用编译器本身来检查我的猜测。但据我所知,#pragma startup在没有争论的情况下发挥作用,并返回空白。

我进一步猜测,如果您只让函数接受int参数,您的代码将无法工作。

忽略这一点,我认为不可能将参数传递给以这种方式调用的函数。

作为解决方案,我建议您创建包装器函数,使用必要的参数调用您想要的任何函数,例如:

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

我不确定我是否完全理解这些限制,但是简单地定义另一个具有不同名称的函数以转发到您想要的函数怎么样?

void fun2() { fun1(42); }
#pragma startup fun2 100

最新更新