#pragma指令编译器是否依赖?

时间:2013-03-09 18:01:09

标签: c pragma

我知道并且我之前使用过#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 个答案:

答案 0 :(得分:5)

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

函数AB未被调用,因为......您不会调用它们。如果您完全理解这一点,请道歉,但是:通过调用函数main来执行C程序。如果您希望调用函数AB,则必须在main函数中执行此操作。

(事实上,最新版本的C标准引入了少量STDC pragma,实现有义务识别,但这并不会对答案产生重大影响)

答案 1 :(得分:2)

是的,#pragma指令依赖于编译器。

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

答案 2 :(得分:1)

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

    #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");
    }

这将有效:

createOverlayElement

答案 3 :(得分:0)

所有#pragma指令都是实现定义的。有一段时间,gcc以相同(通常是不合需要的)的方式响应任何和所有#pragma指令。