2016-01-13 80 views
0

我最近遇到了下面的代碼:使用靜態數組的初始化恆定結構對象

static const struct gaih gaih[] = {  
#if defined __UCLIBC_HAS_IPV6__  
    { PF_INET6, gaih_inet },  
#endif  
    { PF_INET, gaih_inet },  
#if 0 
    { PF_LOCAL, gaih_local },  
#endif  
    { PF_UNSPEC, NULL }  
};  



    struct gaih {  
      int family;  
      int (*gaih)(const char *name, const struct gaih_service *service,  
        const struct addrinfo *req, struct addrinfo **pai);  
     };  


int func{  

const struct gaih *g = gaih;  

    }  

我理解的常數和靜態的含義。 但我能夠以這種粗糙的方式破譯常量對象的靜態初始化背後的邏輯。 請澄清這樣做的原因或使用

+1

這是什麼語言?如果這是C或C++,則應使用正確的語法。 – NathanOliver

+0

它是用於獲取網絡中主機地址的C代碼 – achoora

+1

這不是合法代碼。向我們顯示正確的代碼。 – Simple

回答

1

file.c似乎是一個C文件。在C使用static有兩層含義:

  1. 不在堆棧(例如,對於變量內部函數應當在功能的幾個電話保持其價值)
  2. 從該模塊不出口上(對於變量不得作爲符號提供給連接器)

在這種情況下,它似乎是第二個。變量gaih不得導出(鏈接器可見)static,不得更改const。沒有什麼原油。

但是爲了進一步說明細節,需要完整的有效代碼。它似乎是一個只有一個條目的結構數組的常量和靜態初始化。變量g只是一個指向這個單個條目的指針。

這個例子有一定的相似性,在nss.hstruct gaih_addrtuple這是用於gethostbyname主機名和IP地址的鏈接列表。

1

全局變量gaih被定義爲static,這意味着它是僅在當前文件中可見的,並且const,這意味着它不能被修改一次初始化。

局部變量g也被定義爲const,這意味着它不能被改變。它使用全局gaih數組的地址進行初始化,因此可以將g視爲此上下文中的數組。

g也可以傳遞給另一個函數,可能在不同的文件中。這允許在當前文件之外讀取gaih的內容,這將不會通過嘗試直接引用gaih而被允許。

+0

什麼是'int func {const struct gaih * g = gaih; ''?它肯定不是一個函數...它不會需要至少'int func(void){... return 0; }'使它在C編譯? – ryyker