這是合法的和/或良好的做法嗎?C結構 - 合法成員?
#define SOFTWARE_VERSION_NUMBER "7.0v1.1"
想要struct始終包含版本號。
typedef struct {
char SOFTWARE_VERSION_NUMBER;
int a;
int b;
int c;
}mystruct;
這是合法的和/或良好的做法嗎?C結構 - 合法成員?
#define SOFTWARE_VERSION_NUMBER "7.0v1.1"
想要struct始終包含版本號。
typedef struct {
char SOFTWARE_VERSION_NUMBER;
int a;
int b;
int c;
}mystruct;
不,這不是法律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;
}
好的,謝謝,我的意圖是不分配它像其他成員.....以某種方式使它在結構中不變,只改變宏... – 2009-09-11 01:35:52
與打字不合法。
如果你想存儲一個版本號,我建議將它編碼到一個32位的int並在結構分配時填充它。
您的字符串宏不能存儲在單個字符中。您需要一個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);
不,這不合法。
你可以,但是,這樣做:
#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};
叫我瘋了,但作爲一個開發誰與遠小於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
我可能會問你爲什麼要這些信息存儲在一個結構?它是通過網絡發送的嗎?
遠遠超過存儲,編譯器(或連接器,我不確定)可以將相同的字符串存儲在數據部分中的一個位置,如果使用相同的確切字符串多次使用,所以使用宏不是壞事。個人而言,我會做這樣的事情:
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);
這裏有一個方法,其固定在編譯時一切:
/* -------------------------------------------------- */
/* 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
。
你的代碼甚至不會編譯! – leiz 2009-09-11 01:25:11
沒有警告或錯誤? – 2009-09-11 01:29:08