2012-03-08 8 views
0

変数宣言を外部関数に置くことは可能ですか? Wikipediaから読み込んだ後、変数宣言をCの別の関数に置く

インライン関数は、インライン展開を実行するようにコンパイラに要求された関数です。言い換えれば、プログラマは、コンパイラが、定義された1つの場所で関数を呼び出すためのコードを生成するのではなく、関数が呼び出されるすべての場所に関数の完全な本体を挿入するように要求しました。

私は以下のことが働くと仮定しました。それはしていません。私の知る限り承知しているとして、インライン関数が非インライン関数へ意味的に同等に動作しなければならない - いいえ、それは私の指:(

inline void declaration(){ 
    int a; 
} 

int main(){ 
    declaration(); 
    a=2; 
    return 0; 
} 
+2

ウィキペディアの記事のキーワードは**要求**です。 'inline'は、あなたが尋ねるようにコンパイラに*要求するものではありません。それは単なる示唆です。したがって、インライン関数はすべて非インラインセマンティクスを持たなければなりません。 –

+0

'inline'に関して、gccはC99のセマンティクスを要求するのか、gnu89のセマンティクスを要求するのかに応じて、複数の異なるバージョンのインライン展開を実装していることには注意する価値があります。 – torek

答えて

4

これはどのように行われているのではなく、関数をインライン化するときに何が起こるかを考える方法についての基本的な考え方が必要な場合です。

コンパイラがあなたのコードをこのようなものに変えたとしたら、それがうまくいかない理由がわかります。

int main(){ 
    { 
     int a; 
    } 
    a=2; 
    return 0; 
} 

declaration()への呼び出しを括弧を含む機能の内容に置き換えられ、従ってint a;が内部スコープで宣言され、メイン機能で表示されません。

+1

+1ですが、インライン関数に 'goto'することはできません。 – asaelr

1

を平手打ちするコンパイラのために時間がかかりませんでした法的なコードとしてカウントどんな影響を与える。それはちょうど最適です。特に

、あなたの両方の機能をaという変数を持つことができ、彼らは、スタック上の別の変数であると思います。

(たとえあなたがでもがこれを行うことができたとしても、可読性の観点からは非常に悪い考えです)。

2

いいえ、これはできません。

#define VARBLOCK int a, b, c; char ca, cb, cc; 

int main() 
{ 
    VARBLOCK; 
    a = 2; 
} 

これは悪い習慣のようになります。何ができるか

は、プリプロセッサディレクティブ#defineを使用することです。また、これらは変数が共有されることなく、配置された関数の範囲内でのみ使用可能です。

0

インライン関数は、通常は約4行しか含まない関数であり、コンパイラは最適化を行うことをお勧めします。なぜなら、余分なコードを追加するのではなく、関数の処理が速くなるからです。

インライン展開は、関数呼び出し時の時間オーバーヘッドをなくすために使用します。通常、頻繁に実行される関数に使用されます。

インライン関数には特別なことはありません。コンパイラによって処理が異なる場合があります。彼らは他の関数とスタックを共有しません。これはメインが異なるスコープで作成された変数を使用する唯一の方法です。

私のヒントは、あなたの機能を書いて、あなたが本来必要とするようにそれらを扱う。あなたが終わったら、あなたがたくさん使う短いものをインライン化してください。

実際に別の関数で変数を作成したい場合は、関数内のヒープに変数を割り当て、保存して2(あなたの場合)に設定するポインタを返します。 :)ただメモリを解放することを忘れないでください!

0

あなたはしかし、これを行うことができます:

#include <stdio.h> 

int* GetMyIntAddress(void) 
{ 
    static int blah = 0; 
    return &blah; 
} 

int main(void) 
{ 
    printf("%d\n", *GetMyIntAddress()); 
    *GetMyIntAddress() = 123; 
    printf("%d\n", *GetMyIntAddress()); 
    return 0; 
} 

blahGetMyIntAddress()関数のスコープで定義されたグローバル変数になります。もしGetMyIntAddress()の定義にinlineを追加した場合

は、インライン関数は、(例えば、共有ヘッダーファイルからインクルード)異なるモジュールで使用されている場合blahの複数の独立したインスタンスを取得するために危険にさらしています。