2012-07-19 50 views

回答

29

當C發明時,慣例是如果你沒有指定返回類型,編譯器會自動推斷你想返回一個int(對於參數也是一樣)。但是你經常編寫一些函數來執行某些操作,並且不需要返回任何東西(比如想象一下只是在屏幕上打印某些東西的函數)。出於這個原因,決定爲了指定你根本不想返回任何東西,你必須使用void關鍵字作爲「返回類型」。


請注意,void也可用於其他用途;特別是:

  • 如果您指定它作爲函數參數列表,則表示函數不帶參數;這在C中是需要的,因爲沒有參數的函數聲明意味着編譯器參數列表沒有被指定。在C++中,這不再需要,因爲空參數列表意味着該函數不允許使用任何參數;

  • void在指針中也有重要的作用; void *(及其變體)表示「指向未指定的東西的指針」。如果您必須編寫必須存儲/傳遞指針而不實際使用它們的函數(僅在最後才能實際使用指針,需要將類型轉換爲適當類型),這非常有用。

  • 此外,鑄造到(void)通常用於將值標記爲故意未使用,從而抑制編譯器警告。

    int somefunction(int a, int b, int c) 
    { 
        (void)c; // c is reserved for future usage, kill the "unused parameter" warning 
        return a+b; 
    } 
    
+0

實際上「(void)c」在做什麼? – innochenti 2012-07-19 12:01:49

+2

顯式丟棄右側表達式的值。無論如何,即使你不寫'(void)',它也會這樣做,但它(向讀者和編譯器)闡明你真的不關心返回值;這用於在您明確不關心這些值的情況下關閉一些警告(未使用的返回值,未使用的參數)。同樣,它對生成的代碼沒有任何特別的影響,但它是一個表達特定含義的習慣用語。 – 2012-07-19 12:06:00

+0

@innochenti:參見例如[here](http://stackoverflow.com/a/4178714/214671) – 2012-07-19 12:10:28

0

可能會告訴編譯器「你不需要推送和彈出所有的cpu寄存器!」

+1

咦?!被調用函數仍然會丟棄這些寄存器,即使它沒有返回值。 – Ant 2012-07-19 13:42:55

2

因爲有時你不需要返回值。這就是我們使用它的原因。

1

如果你沒有void,你會怎麼告訴一個函數沒有返回值的編譯器?

+0

如何不指定任何東西?例如。只是簡單的'fooFunction(){}'而不是'void fooFunction(){}'? – 2013-05-08 10:03:36

+1

@AmitTomar在C++中,你_必須指定一個返回類型。在C中沒有返回類型意味着'int'。 – 2013-05-08 10:08:57

+0

我的意思是,爲什麼不能在C++中它是這樣,告訴一個函數沒有返回值,離開了返回類型爲空白編譯器。要指定特定類型,請寫入類型。爲什麼寫作無效的特殊要求?這更多的是設計決定嗎? – 2013-05-08 10:22:27

5

在命令式編程語言(如C,C++,Java等)中,使用void類型的函數和方法會產生副作用。它們不會產生有意義的價值來回報,但它們會以許多可能的方式之一影響程序狀態。例如,C中的exit函數不返回任何值,但它具有中止應用程序的副作用。另一個例子,一個C++類可能有一個void方法來改變它的實例變量的值。

+4

其實'printf'返回的int值等於打印的字符數。 – 2012-07-19 11:49:55

+0

@PaulR哎呀,你是對的。我的臉紅了... – waldrumpus 2012-07-19 12:24:39

+0

@PaulR順便說一句,我該如何做刪除線的文字?我想通過printf示例來避免使您的評論無效,但我無法弄清楚。 – waldrumpus 2012-07-19 12:31:33

5

void()表示不返回任何內容。

void並不意味着沒有void類型代表沒什麼。這是一個微妙的區別:表示仍然是必需的,即使它代表什麼。

This type is used as function's return type which returns nothing。當它用作void*時,這也用於表示通用數據。所以,它聽起來有趣的是,雖然void代表什麼void*代表一切

5

這個問題與語言的歷史有關:C++從C中借用,C用於隱式輸入所有類型爲int(事實證明這是一個可怕的想法)。這包括用作過程的函數(回想一下,函數和過程之間的區別在於函數調用是表達式,而過程調用是語句)。如果我正確地記得它讀取早期的C語言的書籍,程序員用來修補這一缺陷與#define

#define void int 

該公約後來被C標準中採納,並void關鍵字已被引入到表示功能這些目的是作爲程序。這是非常有用的,因爲編譯器現在可以檢查你的代碼是否使用了一個函數的返回值,該函數不打算返回任何東西,並且警告你應該返回的函數,而是讓控制器運行結束。

+1

+1,因爲我在舊代碼中看到了這個'define'語句,被帶有荒謬標籤的'ifdef'阻止了,並且無法弄清楚爲什麼有人寫了它。 – 2014-02-03 23:37:44

1

原因考慮某些情況下,你可能不得不做全局變量一些計算,放在全局變量的結果或要打印的東西取決於參數,等等。在這些情況下,你可以使用不返回值的方法..即無效

1

下面是一個例子功能:

struct SVeryBigStruct 
{ 
    // a lot of data here 
}; 

SVeryBigStruct foo() 
{ 
    SVeryBigStruct bar; 
    // calculate something here 

    return bar; 
} 

而現在這裏的另一個功能:

void foo2(SVeryBigStruct& bar) // or SVeryBigStruct* pBar 
{ 
    bar.member1 = ... 
    bar.member2 = ... 
} 

的第二個函數更快,它不必複製整個結構。

相關問題