C 中的void型別

2022-02-02 20:48:26 字數 1629 閱讀 6655

technorati 標籤: void,指標

1.1. void型別

void型別其實是一種用於語法性的型別,而不是資料型別,主要用於作為函式的引數或返回值,或者定義void指標,表示一種未知型別。

1.1.1. 作為函式引數與返回值

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

class tcpsocket{};

class transfer

public:

enum protocol ;

transfer(protocol prot) : _prot(prot)

if( _prot == udp)

_sock = new udpsocket( );

else if( _prot == tcp )

_sock = new tcpsocket( );

else

throw std::invalid_argument("prot");

~transfer( void )

if(_prot == udp)

delete (udpsocket*)_sock;

else

delete (tcpsocket*)_sock;

_sock = null;

private:

void* _sock;

protocol _prot;

C C 中的void 型別

void即 無型別 void 則為 無型別指標 規則一 如果函式沒有返回值,那麼應宣告為void型別。在c語言中,凡不加返回值型別限定的函式,就會被編譯器作為返回整型值處理。但是許多程式設計師卻誤以為其為void型別。規則二 如果函式無引數,那麼應宣告其引數為void。在c語言中,可以給無引數的函式...

void型別及void指標型別

許多初學者對c c 語言中的void及void指標型別不甚理解,因此在使用上出現了一些錯誤。本文將對void關鍵字的深刻含義進行解說,並詳述void及void指標型別的使用方法與技巧。2.void的含義 void的字面意思是 無型別 void 則為 無型別指標 void 可以指向任何型別的資料。vo...

C語言中的void 和void 指標型別

c語言中的void 和void 指標型別 c語言,void,void指標 許多初學者對c中的void 和void 的指標型別不是很了解。因此常常在使用上出現一些錯誤,本文將告訴大家關於void 和void 指標型別的使用方法及技巧。首先,我們來說說void 的含義,void的字面意思是 無型別 vo...