2009-09-09 40 views
4

在C/C++中,如何確定成員變量的大小而不需要定義該結構類型的虛擬變量?下面是如何做到這一點錯了一個例子,但說明的意圖:什麼是常見的C/C++宏來確定結構成員的大小?

typedef struct myStruct { 
    int x[10]; 
    int y; 
} myStruct_t; 

const size_t sizeof_MyStruct_x = sizeof(myStruct_t.x); // error 

供參考,這應該是如何找到的「X」的大小,如果你先定義一個虛擬變量:

myStruct_t dummyStructVar; 

const size_t sizeof_MyStruct_x = sizeof(dummyStructVar.x); 

但是,我希望避免必須創建一個虛擬變量來獲得'x'的大小。我認爲有一種巧妙的方式來重新設置0作爲myStruct_t來幫助查找成員變量'x'的大小,但是已經足夠長,我忘記了詳細信息,並且似乎無法在此上獲得良好的Google搜索。你知道嗎?

謝謝!

回答

18

在C++(這是標籤說什麼),你的「虛擬變量」代碼可以被替換爲:

sizeof myStruct_t().x; 

沒有myStruct_t對象將被創建:編譯器只能進行靜態類型的sizeof年代操作數,它不執行表達式。

這個工作在C和C++中是更好,因爲它也適用於類,而一個可訪問的無參數的構造函數:

sizeof ((myStruct_t *)0)->x 
+0

酷!這在C++中適用於我。在C中有沒有辦法做到這一點? – 2009-09-09 16:24:29

+0

和C呢?我不需要這個,但我真的很想知道:-) – p4bl0 2009-09-09 16:24:47

+1

+1不使用宏並增加了混淆。 – Kredns 2009-09-09 17:45:29

3

您可以輕鬆地做

sizeof(myStruct().x) 

由於的sizeof參數從未執行,你不會真的創建該對象。

3

任何這些應該工作:

sizeof(myStruct_t().x;); 

myStruct_t *tempPtr = NULL; 
sizeof(tempPtr->x) 

sizeof(((myStruct_t *)NULL)->x); 

因爲sizeof是在編譯時進行計算,而不是運行時,你贏了」解除引用NULL指針有問題。

11

我使用下面的宏:

#include <iostream> 
#define DIM_FIELD(struct_type, field) (sizeof(((struct_type*)0)->field)) 
int main() 
{ 
    struct ABC 
    { 
     int a; 
     char b; 
     double c; 
    }; 
    std::cout << "ABC::a=" << DIM_FIELD(ABC, a) 
       << " ABC::c=" << DIM_FIELD(ABC, c) << std::endl; 

    return 0; 
} 

招是治療0爲指針,以你的結構。這是在編譯時解決的,所以它很安全。

+0

好!那是我正在尋找的宏! – 2009-09-09 16:29:13

0

從我的工具宏頭:

#define FIELD_SIZE(type, field) (sizeof(((type *)0)->field)) 

調用,像這樣:

FIELD_SIZE(myStruct_t, x); 
1

在C++ 11,這可以用sizeof(myStruct_t::x)來完成。 C++ 11還增加了std::declval,它可以用於此(除其他之外):

#include <utility> 
typedef struct myStruct { 
    int x[10]; 
    int y; 
} myStruct_t; 

const std::size_t sizeof_MyStruct_x_normal = sizeof(myStruct_t::x); 
const std::size_t sizeof_MyStruct_x_declval = sizeof(std::declval<myStruct_t>().x); 
相關問題