2013-03-09 8 views
6

前に#pragma startup#pragma exitを使用しましたが、次のコードを実行するとIn mainしか出力されません。誰が私にここで何が起こっているか教えてもらえますか?#pragmaディレクティブコンパイラは依存していますか?

#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コンパイラを使用しています。

答えて

5

すべて#pragmaディレクティブはコンパイラに依存しており、コンパイラはそれが認識しないいずれかを無視する義務がある(ISO-9899:2011、s6.10.6は:「実装によって認識されない任意のそのようプラグマは無視されます」)。それであなたのプログラムはうまくコンパイルされます。

機能AおよびBは呼び出されないため呼び出されません。あなたがこれを完全によく理解すれば謝りますが、Cプログラムは関数mainを呼び出して実行されます。 ABを呼び出すには、main関数内で関数を呼び出さなければなりません。

(実際には、Cの標準の最近のバージョンでは実装が認識するように義務付けられてSTDCプラグマの小さな数を導入しているが、それは重要なことの答えには影響しません)私の知る限りでは

+0

おばあさん。しかし、少なくとも私は関数を実行する方法を知っています。 –

+0

関数AとBは、 '起動'と '終了'引数を使用して#pragmaディレクティブを使用して呼び出されます。したがって、彼は関数AとBを主関数から明示的に呼び出す必要はありません。メイン関数の実行の前後に自動的に呼び出されます。 –

2

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

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

+0

それは私が、なぜそれがコンパイルエラーは発生しませんでした使用しているコンパイラでサポートされていない場合は?つまり、コードは正常に実行されますが、関数 'A()'と 'B()'は呼び出されません。それは奇妙じゃない? –

+0

これは奇妙なことですが、コンパイラの裁量で、サポートされていないプラグマをどのように扱うかについては残っていると思います。 –

0

すべて#pragmaディレクティブは実装定義です。一度に、gccはすべての#pragmaディレクティブに同じ(一般的に望ましくない)方法で応答しました。

1

、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"); 
    } 
関連する問題