2016-08-24 89 views
0

我總是在main()之前聲明函數。令我困惑的是聲明,定義,分配和傳遞函數參數的正確(或至少是最佳實踐)方法。例如,這個工程:正確的C函數參數變量定義位置

// EXAMPLE 1 // 
int idum1 = 1; 

void my_func(int); // Says the function's going to need an integer. 

void main (void) 
{ 
    my_func(idum1); 
} 

void my_func(idum2) // Is this then declaring AND defining a local integer, idum2? 
{ 
    // Do stuff using idum2... 
} 

但這個工程太:

// EXAMPLE 2 // 
int idum1 = 1; 

void my_func(int idum2); //Is this declaring a variable idum2 local to my_func? 

void main (void) 
{ 
    my_func(idum1); 
} 

void my_func(idum3) // A different variable or the same one (idum2) still works. 
        //Is this declaring idum3 as a local integer? 
{     //What happened to idum2, still a viable integer in the function? 
    // Do stuff using idum3... 
} 

而且這個工程:

// EXAMPLE 3 // 
int idum1 = 1; 

void my_func(int idum2); // Declaring... 

void main (void) 
{ 
    my_func(idum1); 
} 

void my_func(int idum2) //Declaring again. Different address as in function declaration? 
         //Same variable and address? 
{ 
    // Do stuff using idum2... 
} 

所以做到這一點:

// EXAMPLE 4 // 
int idum1 = 1; 

void my_func(int); 

void main (void) 
{ 
    my_func(idum1); 
} 

void my_func(int idum2) //Yet another way that works. 
{ 
    // Do stuff using idum2... 
} 

我是一個自學成才的初學者,但我一直在吱吱嘎嘎並沒有真正瞭解正確的方式以及幕後發生的事情。我只知道它有效(總是很危險)。

我的直覺說例4是最好的方法;告訴它它需要什麼類型,然後在函數中將它聲明爲類型以便於編碼和錯誤檢查。我確信有這樣或那樣的理由,這取決於你想要做什麼,但真的可以在這裏使用一些指導。

我確實看到了示例3,但看起來多餘,聲明瞭一個變量兩次。

有人可以解釋或指向我的一篇文章,解釋我試圖在這裏得到的東西的來龍去脈嗎?幾乎不知道我在問什麼,iykwim。網絡上的一切都如此碎片化。試過CodingUnit,但教程只是不夠深入。 TIA!

+2

'void main(void)'是宿主環境中的無效簽名。 'main'將返回一個'int'結果。 – Olaf

+0

如果這是「主要基於意見」,「太寬泛」或「尋求外部資源」,我真的很掙扎。無論如何,它在這裏是無關緊要的。 – Olaf

+1

看來你需要適當的知識。我的建議是去C的權威書籍清單。 –

回答

0

在轉發聲明中,您不需要提供參數名稱,只需鍵入type(雖然可以提供名稱)。但是這並不一定與定義函數時相同。

功能定義說void my_func(int i){..},此功能參數爲int類型,變量名稱爲i。您可以在功能塊內通過變量名稱i訪問它的值。

此外,沒有重新聲明變量,因爲它們的範圍僅限於功能塊。

這些方法基本上沒有區別,按照慣例如何使用它。

0

這將工作太:

void my_func(int); 

在函數簽名這不是關於名稱的爭論而是的類型。

有,當你用相同的名字聲明一個外部變量作爲參數

int idum1 = 1; 

void my_func(int idum1) 
{ 
    idum1++; 
} 

這裏最局部範圍的變量特殊規則遞增,而不是外部。