2009-09-11 148 views
0

這是合法的和/或良好的做法嗎?C結構 - 合法成員?

#define SOFTWARE_VERSION_NUMBER "7.0v1.1" 

想要struct始終包含版本號。

typedef struct { 
    char SOFTWARE_VERSION_NUMBER; 
    int a; 
    int b; 
    int c; 
}mystruct; 
+3

你的代碼甚至不會編譯! – leiz 2009-09-11 01:25:11

+0

沒有警告或錯誤? – 2009-09-11 01:29:08

回答

3

不,這不是法律C.

做到這一點,最好的方法是創建一個函數來生成你的結構的新實例,並把分配在那裏:

#define SOFTWARE_VERSION_NUMBER "7.0v1.1" 

typedef struct { 
    char ver[sizeof SOFTWARE_VERSION_NUMBER]; 
    int a; 
    int b; 
    int c; 
} mystruct; 

mystruct *mystruct_new(int a, int b, int c) 
{ 
    mystruct *ms = malloc(sizeof *ms); 

    if (ms) 
    { 
     strcpy(ms->ver, SOFTWARE_VERSION_NUMBER); 
     ms->a = a; 
     ms->b = b; 
     ms->c = c; 
    } 

    return ms; 
} 
+0

好的,謝謝,我的意圖是不分配它像其他成員.....以某種方式使它在結構中不變,只改變宏... – 2009-09-11 01:35:52

1

與打字不合法。

如果你想存儲一個版本號,我建議將它編碼到一個32位的int並在結構分配時填充它。

2

您的字符串宏不能存儲在單個字符中。您需要一個char *或char [strlen(SOFTWARE_VERSION_NUMBER)]緩衝區。

typedef struct _mystruct_t 
{ 
    char version[10]; 
    int etc; 
} mystruct_t; 

mystruct_t ms; 
strcpy(ms.version, SOFTWARE_VERSION_NUMBER); 
2

不,這不合法。

你可以,但是,這樣做:

#define SW_VERSION "1.01" 
typedef struct _foo { 
char ver[sizeof SW_VERSION]; 
int a; 
int b; 
int c; 
} foo; 

foo bar={SW_VERSION,1,2,3}; 
+0

不編譯 – 2009-09-11 01:30:36

+0

你是對的,在編輯修復。 – cigarman 2009-09-11 01:31:11

+0

正如Adam在下面指出的那樣,最好的方法是使用const char *,但我只是使用OP的代碼。所以,如果你要實現這個,使用const char *,而不是#define。 – cigarman 2009-09-11 13:39:40

2

叫我瘋了,但作爲一個開發誰與遠小於640K of memory削減在嵌入式系統上他的牙齒,我畏縮每次我看到#define「d串。在不更改默認設置的情況下,編譯器可能會創建一個字符串—的新實例,並且可能會在每次使用該宏時爲該新實例分配內存—。

的替代,其分配的字符串只有一次:

const char * const MyVersion = "7.0v1.1" // Const ptr to const string 

typedef struct _foo_t { 
    const char *ver; 
    int a; 
    int b; 
    int c; 
} foo_t; 

foo_t bar = { MyVersion, 1, 2, 3 }; // Copy the ptr, not the string 
1

我可能會問你爲什麼要這些信息存儲在一個結構?它是通過網絡發送的嗎?

遠遠超過存儲,編譯器(或連接器,我不確定)可以將相同的字符串存儲在數據部分中的一個位置,如果使用相同的確切字符串多次使用,所以使用宏不是壞事。個人而言,我會做這樣的事情:

const char *GetSoftwareVersion (void) 
{ 
    return "Version 7.0.1"; 
} 

如果它是一個插件,像DLL架構,功能版本是最appopriate(如下列:

const char *pluginVer = dll->GetSoftwareVersion(); // where GetSoftwareVersion is of type: 
typedef const char *(* GetSoftwareVersionProc)(void); 
1

這裏有一個方法,其固定在編譯時一切:

/* -------------------------------------------------- */ 
/* Version.h */ 
#define SOFTWARE_VERSION_NUMBER "7.0v1.1" 

/* -------------------------------------------------- */ 
/* Global.h */ 
#define SoftwareVersionLENGTH 8 
extern const char Global_SoftwareVersion[SoftwareVersionLENGTH]; 

/* -------------------------------------------------- */ 
/* Global.c */ 
#include "Global.h" 
#include "Version.h" 
const char Global_SoftwareVersion[SoftwareVersionLENGTH] 
    = SOFTWARE_VERSION_NUMBER; 

如果需要更改版本號,只version.h中必須進行編輯(假設版本字符串沒有得到任何更長)

然後可以在代碼中始終引用常量字符串Global_SoftwareVersion