2016-08-31 59 views
4

是否可以在初始化中隱式聲明一個變量? 也許像這樣:C中的隱式「聲明實例化」?

struct S 
{ 
    void *a; 
    void *b; 
}; 

struct S test = {&(int), &(float) }; 

void testfunc (void) 
{ 
    *(test.a) = -2; 
    *(test.b) = 1.3; 
} 

優勢(在我眼裏):

  1. 需要顯式聲明
  2. 隱含變量是在結構中,沒有外部訪問保護沒有額外的線路。
+6

不,不可能做任何這樣的事情。除非你動態地分配內存。另外,你不能在不鑄造的情況下解除引用'void *'。 –

+6

不,這是不可能的。 –

+1

更重要的是,它沒有意義。是的,您可以將空指針設置爲指向複合文字,但該結構不包含任何類型信息,因此無法實現。你試圖解決的實際問題是什麼?你們兩個所謂的「優點」是無稽之談,並非如此。你可能想看看_opaque types_。 – Lundin

回答

1

不,那是不可能的。地址 - 運算符需要一個實際存在的符號作爲它的參數。

的C11草案說:

一元&運算符的操作數應是一個功能 指示符,一個[]或一元*操作符的結果,或左值即 指定的一個對象,該對象是不是位字段,並且不用 register存儲類說明符聲明。

5

是的,它是可能的,因爲C99。你的猜測非常接近;但需要提供支撐初始化,即使你打算以後指定另一個值:

struct S test = { &(int){0}, &(float){0} }; 

此功能稱爲compound literal。複合文字是一個左值。

請注意,您的testfunc包含一個錯誤,雖然;因爲a的型號爲void *,所以不能寫*(test.a)。您可以將S更改爲int *a; float *b;,或者您必須在寫作時進行投票,例如*(int *)test.a = 5;

+0

使用複合文字值不能修改。看來,OP想要改變執行過程中取消引用的值。 – LPs

+2

@LP:標準給出了一個例子(不規範的,但表示):_The以下三個表達式具有不同的含義:_' 「/ TMP/fileXXXXXX」' - '(炭[]){ 「/ TMP/fileXXXXXX」} ' - '(爲const char []){ 「/ TMP/fileXXXXXX」}' - _The第一總是具有靜態存儲持續時間,且類型char'的'陣列,但不必是可修改的;最後 兩者具有自動存儲持續時間時發生的功能的主體內它們,並且第一這些 兩個是modifiable._還有'const'限定複合文字的討論。這清楚地表明覆合文字可以被修改。 –

+0

@JonathanLeffler謝謝。很有意思。 – LPs