2009-09-11 105 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