6

#pragma startup我知道并且我以前使用过,#pragma exit但是当我执行以下代码时,它只输出In main. 谁能告诉我这里发生了什么?

#include<stdio.h>
#pragma startup A 110
#pragma startup B
#pragma exit A
#pragma exit B 110

int main()
{
    printf("\nIn main");
    return 0;
}

void A()
{
    printf("\nIn A");
}

void B()
{
    printf("\nIn B");
}

还是它依赖于编译器?我正在使用 gcc 编译器。

4

4 回答 4

5

所有#pragma指令都依赖于编译器,编译器必须忽略任何它无法识别的指令(ISO-9899:2011,s6.10.6:“任何未被实现识别的编译指示都会被忽略。”)。这就是您的程序编译成功的原因。

函数AB没有被调用,因为......你不调用它们。抱歉,如果您完全理解这一点,但是:通过调用函数来执行 C 程序main。如果你想要函数A并被B调用,你必须在main函数中这样做。

(事实上​​,C 标准的最新版本引入了少量的STDC编译指示,实现必须识别,但这并不重要地影响答案)

于 2013-03-09T18:22:59.707 回答
2

是的,该#pragma指令取决于编译器。

更具体地说,支持的选项是特定于编译器的。许多或大多数编译器可能支持某些选项,但在许多情况下,这些选项特定于每个编译器。

于 2013-03-09T18:03:11.450 回答
2

据我所知,gcc 根本不支持启动/退出编译指示。您必须使用属性才能使其与 gcc 一起使用。

__attribute__((constructor))
__attribute__((destructor))
__attribute__((constructor (PRIORITY)))
__attribute__((destructor (PRIORITY)))

这将起作用:

    #include<stdio.h>
    void A() __attribute__((constructor(110)));
    void B() __attribute__((constructor));
    void A() __attribute__((destructor));
    void B() __attribute__((destructor(110)));

    int main()
    {
        printf("\nIn main");
        return 0;
    }

    void A()
    {
        printf("\nIn A");
    }

    void B()
    {
        printf("\nIn B");
    }
于 2017-01-03T09:27:50.703 回答
0

所有#pragma指令都是实现定义的。有一次,gcc 以#pragma相同(通常不受欢迎)的方式响应任何和所有指令。

于 2013-03-09T18:03:57.103 回答