2011-07-30 58 views
4

test.c的難道在C與空變量編譯

int main() { 
    void a; 
    return 0; 
} 

我用gcc來編譯,但它給我一個錯誤:

error: variable or field 'a' declared void

從我讀here, 我想我可以毫無問題地聲明void變量。

+4

你可以有一個指向void *('void *')的指針,但是不存在void變量。 –

+1

有一個'void'類型的變量不是我認爲有任何用處的東西。一般來說,空白意味着沒有任何東西,例如返回void的函數通常會返回,但不會將任何回傳給調用者。在一個完全不同的意義上,一個指向void的指針僅僅意味着該類型沒有被指定爲指針指向的任何類型。 – ambagesia

回答

9

由於你的鏈接狀態:

A variable that is itself declared void (such as my_variable above) is useless; it cannot be assigned a value, cannot be cast to another type, in fact, cannot be used in any way.

這意味着,雖然語法正確,一個void聲明不是什麼有用的,這就是爲什麼GCC可能認爲這是一個錯誤。即使它會編譯,你也無法對變量做任何事情,所以我想你的問題只是與測試這種行爲有關。

實際上,void在我們談論指針時很有用(void*),因爲它允許您聲明通用指針而不指定類型。

+2

void作爲返回類型也很有用。

+0

也可用於強制忽略返回值的警告 – Jasen

5

不,但你可以聲明一個空指針:void *。 A void *可以容納任何對象指針。

void *'s are only guaranteed to hold object (i.e. data) pointers

[但]

it is not portable to convert a function pointer to type void *

1

儘管書中陳述void a;是一個有效的陳述,但我不相信它符合標準。這就是說,這本書的第一版是從1987年開始的,所以它也可以從GCC的舊版本中繼承下來。

0

void *x;是一個有效的聲明。

void x;不是一個有效的陳述。

返回指向void的指針的函數也是有效的。

這是爲什麼?

當在函數中聲明變量時,編譯器必須爲變量分配一個內存空間。但是當一個變量的類型爲void時,編譯器不知道爲這個變量分配多少個字節。所以這對編譯器不起作用。 但是,指向void的指針是不同的。指針可以是void類型,它可以在讀取時讀取爲int或double或float或short或char。在這種情況下,編譯器需要顯式類型轉換或自動類型提升。

例如

int 
function_A(void *x) 
{ 
    int *p = (int *)x; 
    return *p; 
} 

double 
function_B(void *x) 
{ 
    double *p = (double *)x; 
    return *p; 
} 

重要提示:C不允許空指針的取消引用的直接類型轉換。 我的意思是,你不能做到這一點:

double 
function_B(void *x) 
{ 
    return (double)*x; 
} 

概念上,這非常有意義。但C不允許這樣做。

+0

始終預覽您的帖子,以便您可以看到您所做的任何錯誤,例如忽略代碼塊之前的空白行。 –