2013-07-25 34 views
0

我正在研究一個項目變得越來越複雜。項目由彼此獨立的代碼部分組成,其中包含大量的數學計算,然後是複雜的輸出生成。所有這些都用pthread封裝在一個套接字中。使功能表現得像一個示波器

整體看起來是這樣的:

的Main() - >插座 - >話題 - >請求處理 - >一個或多個獨立的部分

我想附上代碼的每一獨立節在一個函數內部,並且該函數從一個調用者函數繼承變量,但那是行不通的。

下面是簡化的什麼,我想實現的版本:

void func_a(){int c;b+=a;c=1;b+=c;} 
int main(){ 
int a,b,c; 
a=3;b=2;c=0; 
func_a(); 
printf("b:%d c:%d\n",b,c); 
return 1; 
} 

上面的代碼不工作,但這個工作得很好,和做什麼,我想:

int main(){ 
int a,b,c; 
a=3;b=2;c=0; 
{int c;b+=a;c=1;b+=c;} 
printf("b:%d c:%d\n",b,c); 
return 1; 
} 

我可以只需將一個函數的代碼放入一個文件中,然後執行{#include ...},但也許有更好的方法可以做到這一點?

有關管理這種事情的任何其他想法和建議也表示讚賞。

謝謝。

P.S.

由於使用線程,使用全局作用域不是一個選項。只是將變量傳遞給函數不是一個選項,它將需要30多個參數。我已經有了一堆結構,因此將所有變量放入一個結構體中不是一個選項ether。

+0

如果你不關心可移植性,那麼你可以考慮使用gcc的嵌套函數支持。 –

+0

使用GCC本地函數定義。 – BLUEPIXY

回答

0

有不同的方法來實現你所需要的。

首先是使用gcc 嵌套函數。不幸的是,它們是非標準的,因此完全依賴於編譯器。你可以在這裏找到一些信息:Stack Overflow nested C functionGCC Nested functions manual。如果你不需要可移植性,這可能是一個有效的解決方案。

另一種解決方案可能是用僞函數的代碼定義一個宏。編譯器將每次替換宏被調用,並自動將定義的變量繼承到調用者函數中。

我重寫了這兩個解決方案的例子。

#include <stdio.h> 

#define FUNC_A() {int c;b+=a;c=1;b+=c;} 
#define FUNC_A2(_a,_b) {int c;_b+=_a;c=1;_b+=c;} 

int main(){ 
    int a,b,c; 
    void func_a(){int c;b+=a;c=1;b+=c;} 

    // nested solution 
    a=3;b=2;c=0; 
    func_a(); 
    printf("b:%d c:%d\n",b,c); 

    // macro solution 
    a=3;b=2;c=0; 
    FUNC_A(); 
    printf("b:%d c:%d\n",b,c); 

    // macro solution 
    a=3;b=2;c=0; 
    FUNC_A2(a,b); 
    printf("b:%d c:%d\n",b,c); 

    return 0; 
} 

所有的解決方案都有相同的結果。 :D

+0

我試圖去一個函數的原因之一是因爲我期待編譯器會有更好的時間來優化重複代碼。我想堅持一個標準,那麼關於編譯器如何優化重複範圍的任何想法? – Ignas2526

+0

對宏使用解決方案時,編譯器會優化代碼,就好像它是在調用者函數中編寫的一樣。因此,您正在避免調用函數的所有開銷(push/pop參數,堆棧中的地址)。如果你在宏之前使用了一個變量,然後你在宏中使用了相同的變量,那麼編譯器足夠聰明,可以將它保存在寄存器中,而不需要進入內存。如果你擔心性能,MACROS不會影響你的表現。 –

+0

它可以與宏一起工作還是找到另一種解決方案? –