2012-03-08 51 views
0

是否可以將變量聲明放入外部函數中? WikipediaWikipedia讀取後:將變量聲明放在單獨的函數中C

內聯函數是一個函數,編譯器被請求執行內聯擴展。換句話說,程序員已經要求編譯器在函數被調用的每個地方插入函數的完整主體,而不是生成代碼來在定義的地方調用函數。

我假設以下可能有效。它沒有多久,編譯器就打我的手指:(

inline void declaration(){ 
    int a; 
} 

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

該維基百科文章中的關鍵字是**請求**。 'inline'並不要求編譯器根據你的要求去做,它只是一個建議。因此,內聯函數必須都具有非內聯語義。 – 2012-03-08 08:07:53

+0

關於'inline',值得注意的是,gcc實現了多個不同版本的內聯擴展,取決於你是否要求C99語義或gnu89語義等等。這有點亂。 – torek 2012-03-08 11:21:33

回答

4

這可能不是如何完成的,但如果您想了解如何考慮內聯函數時會發生什麼的基本概念。

想象一下編譯器將你的代碼變成這樣的東西,然後你明白爲什麼它不起作用。

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

declaration()該呼叫由包括括號內的函數的內容替代,由此int a;在內部範圍被聲明,而不是在主函數可見。

+1

+1,但當然,你也不能'轉到'內聯函數。 – asaelr 2012-03-08 09:06:40

1

否 - 據我所知inline函數的行爲必須等同於非內聯函數語義;它不影響法律的代碼最重要的。這只是一個優化。

特別是,你可以一個在函數調用a變量,但他們會在堆棧上不同的變量。

(即使你可能做到這一點,我認爲這將是一個非常糟糕的想法在可讀性方面。)

2

不,這是不可能的。

什麼是可能的,是使用預處理指令#define

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

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

這將是一個不好的做法。而且這些仍然是變量,只有在它被放置的函數範圍內纔可用,沒有值被共享。

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; 
} 

blah將在GetMyIntAddress()功能的範圍內定義的全局變量。

如果添加inline到的GetMyIntAddress()定義,你處於危險之中,如果內聯函數在不同的模塊(例如,從一個共享頭文件包括)用於獲取的blah多個獨立實例。