2014-04-01 65 views
0

我在VC++ 2008中編寫C程序我有下面的結構和枚舉。如何在Visual C++中將C中的字符大小設置爲size char

test.h

#ifndef _TEST_H_ 
#define _TEST_H_ 

typedef enum Selection 
{ 
    None, 
    Single, 
    Multiple 
} Selection_T; 

typedef struct Test_struct 
{ 
    char var1; 
    char var2; 

    Selection_T sel; 
} Test_struct_T; 

#endif 

test.c的

#include "stdio.h" 
#include "test.h" 
Test_struct_T test_obj = { 1, 2, Multiple }; 

int main() 
{ 
    char *pbyte = (char *)&test_obj; 

    int i=0; 
    for(i=0;i<sizeof(test_obj);i++) 
     printf ("%x\n",*(pbyte+i)); 

    getchar(); 

    return 0; 
} 

我想SEL應該在結構第3個字節,但編譯器處理枚舉爲整啓動,以便SEL從5日開始(2洞)後請幫助我編譯器將enum作爲字節處理,所以sel應該從結構的第3個字節開始。 如果有Pragma,它會對我有用。 感謝推進

+0

閱讀有關['的#pragma pack'](http://msdn.microsoft.com/en-us/library/2e70t5y1。 ASPX)。 –

+1

即使您的編譯器將枚舉視爲字節(請參閱Dabo答案),它也不會將您從結構對齊中解救出來(請參閱Joachim註釋)。把它們放在一起... –

回答

3

在C++ 11你可以聲明與underlying type以外的scoped enumint默認。例如:

typedef enum Selection: unsigned char 
{ 
    None, 
    Single, 
    Multiple 
} Selection_T; 

在C++中,之前的C++ 11標準,或C,這是不可能的。該實施確定了enum的表示形式。在Microsoft編譯器的情況下,enum表示爲int

如果您希望使用單個字節來存儲此信息,那麼您不能使用enum,而應該使用unsigned char

的確,您可以打包您的結構,但這有缺點。您現在將會有未對齊的數據,並且您的變量仍然是4個字節寬。

+0

嗨@David Heffernan謝謝你的回覆我試過這但是這將適用於C++程序,但不適用於C程序。我需要C程序 – Naidu

+0

對不起,我沒有發現那個細節。在這種情況下,您無法使用枚舉來滿足您的需求。 –

+0

當我運行該程序所需的內存空間爲12002000,因爲枚舉被認爲是一個整數它採取4bytes作爲內存空間,但我想枚舉被認爲是一個字符,即只是一個字節,以便我可以避免這些洞在兩者之間的形成將拯救我的記憶。即C程序的輸出也應該是類似於122的東西,是否有可能使C編譯器像在CPP的情況下一樣將Char枚舉爲Char? @david – Naidu

0

在MSVC下面是我使用一個可行的構建體:

typedef enum { 
    zero, 
    one 
} Int; 

struct test { 
    Int first:8; 
    int fill:24; 
}; 

void main(int argc, char **argv) { 
struct test mine[1]; 

    mine->first = zero; 
} 
相關問題