6

#pragma startup以前にandを使用したことは知ってい#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。関数AB呼び出したい場合は、関数内で行う必要がありmainます。

STDC(実際、C 標準の最近のバージョンでは、実装が認識しなければならない少数のプラグマが導入されていますが、それは答えに大きな影響を与えるものではありません)

于 2013-03-09T18:22:59.707 に答える
2

はい、#pragmaディレクティブはコンパイラに依存します。

具体的には、サポートされるオプションはコンパイラ固有です。一部のオプションは、多くのまたはほとんどのコンパイラでサポートされている場合がありますが、多くの場合、オプションは各コンパイラに固有です。

于 2013-03-09T18:03:11.450 に答える
2

私の知る限り、gcc は単に startup/exit プラグマをサポートしていません。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 に答える