test.c的難道在C與空變量編譯
int main() {
void a;
return 0;
}
我用gcc來編譯,但它給我一個錯誤:
error: variable or field 'a' declared void
從我讀here, 我想我可以毫無問題地聲明void變量。
test.c的難道在C與空變量編譯
int main() {
void a;
return 0;
}
我用gcc來編譯,但它給我一個錯誤:
error: variable or field 'a' declared void
從我讀here, 我想我可以毫無問題地聲明void變量。
由於你的鏈接狀態:
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*
),因爲它允許您聲明通用指針而不指定類型。
void作爲返回類型也很有用。
也可用於強制忽略返回值的警告 – Jasen
不,但你可以聲明一個空指針: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 *
儘管書中陳述void a;
是一個有效的陳述,但我不相信它符合標準。這就是說,這本書的第一版是從1987年開始的,所以它也可以從GCC的舊版本中繼承下來。
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不允許這樣做。
始終預覽您的帖子,以便您可以看到您所做的任何錯誤,例如忽略代碼塊之前的空白行。 –
你可以有一個指向void *('void *')的指針,但是不存在void變量。 –
有一個'void'類型的變量不是我認爲有任何用處的東西。一般來說,空白意味着沒有任何東西,例如返回void的函數通常會返回,但不會將任何回傳給調用者。在一個完全不同的意義上,一個指向void的指針僅僅意味着該類型沒有被指定爲指針指向的任何類型。 – ambagesia