2 回答

TA貢獻1839條經驗 獲得超15個贊
void類型:
void類型其實是一種用于語法性的類型,而不是數據類型,主要用于作為函數的參數或返回值,或者定義void指針,表示一種未知類型。
作為函數參數與返回值:
void func( void );
void func( );
例如上面兩例,其實兩種聲明方式是等效的,在C++中如果參數列表為空,默認的參數類型即為void,但建議沒有參數時使用void以提高程序的可讀性。
因為C++在定義函數時不允許返回值類型為空,在C++98之前,是允許定義函數時不定義返回值的,默認的返回值是int類型。其實默認int類型并不是好事,如果函數有返回值在函數返回時是需要消耗CPU傳遞返回值的,也或許也是C++98標準將默認返回值類型改為void的原因。
因為C++不允許默認返回值,所以當函數不需要返回值是,需要將返回值類型聲明為int類型。當調用返回值類型為void類型的函數時,在工程上有很多實際代碼在前面加上(void)類型轉換,以提高代碼的可讀性。如調用上面定義的
func函數。
(void)func( );
從另一個角度講,這樣嚴謹的方式是可以提高軟件的健壯性的,調用函數時可以明確地看出是沒有返回值的,如果調用一個返回值不是int類型的函數時最好判斷其返回值,以檢查函數調用是否成功,如:
#include
char buff[5];
func( );
snprintf(buff, sizeof(buff), “%d”, “10240”);
顯然這段代碼是有問題的,當然func沒有返回值,這樣調用是沒有問題,但snprintf的調用會有問題因為緩沖區有可能太小而不能容納結果字符串,上面的代碼就有這個問題。假設我們不知道snprintf有沒有返回值,可能這個BUG我們不會發現,直到有一天出現了我們不期望的結果。如果我們嚴格要求調用每個函數時必須判斷函數的返回值,按照以下面的代碼編碼,就不會出給我們的程序造成隱患。
#include
#include
char buff[5];
(void)func( );
if( sizeof(buff) <= snprintf(buff, sizeof(buff), "%d", 10240) ){
buff[sizeof(buff) - 1] = '/0';
throw std::overflow_error("buff overflow");
}
- 2 回答
- 0 關注
- 1179 瀏覽
添加回答
舉報