2017-01-02 59 views
0

我試圖將一些GCC嵌套函數移植到clang。由於gng嵌套函數在clang中不受支持,我需要使用c-block。Clang C塊:調用後的塊函數定義

但我想在調用它之後有塊定義。 (我需要這個順序,因爲代碼是從宏觀產生的,我不能安排這個順序)

所以在GCC我有這樣的僞代碼:

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)或[重寫與用於鏘嵌套函數GCC清理宏?]( http://stackoverflow.com/questions/24959440/rewrite-gcc-cleanup-macro-with-nested-function-for-clang) – Stargateur

回答

0

在你的第二個例子,hello尚未確定你打電話之前,因此它是一個未定義的符號。你必須告訴編譯器什麼東西,然後才能使用它。

在僞代碼,一個函數原型preceeds一切,這告訴編譯器周圍的誤差會「這將在稍後確定。」

相關問題