2017-01-02 11 views
0

私はGCCネストされた関数をclangに移植しようとしています。 gccのネストされた関数はclangではサポートされていないので、代わりにc-blockを使う必要があります。Clang Cブロック:呼び出し後のブロック関数定義

しかし、私はそれを呼び出した後にブロック定義をしたいです。だから、gccので、私は、この擬似コードを持って

(コードがMACROから生成され、私はこの順序を手配することができないので、私はこの順序が必要):

foo(){ 
    auto void bar (void); 
    ... 
    bar() 
    ... 
    void bar(void) { 
    ...some stuff 
    } 
} 

私はCブロック打ち鳴らす機能でこれを行うことができます?

このコードは

int main() { 
    void (^hello)(void); 

    hello = ^(void){ 
    printf("Hello, block!\n"); 
    }; 

    hello(); 
    return 0; 
} 

正常に動作します。しかし、次のコード

int main() { 
    void (^hello)(void); 

    hello(); 

    hello = ^(void){ 
    printf("Hello, block!\n"); 
    }; 

    return 0; 
} 

は、セグメンテーション違反で失敗しました。

+1

[Cの移植可能なネストされた関数](http://stackoverflow.com/questions/12214867/portable-nested-functions-in-c)または[Clangの入れ子関数を持つGCCクリーンアップマクロの書き換え?]( http://stackoverflow.com/questions/24959440/rewrite-gcc-cleanup-macro-with-nested-function-for-clang) – Stargateur

答えて

0

2番目の例では、helloが呼び出される前に定義されていないため、未定義のシンボルです。あなたはコンパイラに何を言わなければならないのですか?何かを使う前です。

擬似コードでは、関数プロトタイプがすべての前にあります。コンパイラに "これは後で定義されます"と伝えてエラーを回避します。

関連する問題