C结构 - 合法成员?

时间:2009-09-11 01:22:42

标签: c data-structures

这是合法的和/或良好的做法吗?

#define SOFTWARE_VERSION_NUMBER  "7.0v1.1" 

希望struct始终包含版本号。

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

7 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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 :(得分: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};

答案 3 :(得分:2)

叫我疯了,但作为一个在远低于640K of memory的嵌入式系统上煞费苦心的开发人员,我每次看到#define'字符串时都会感到畏缩。在不更改默认设置的情况下,编译器可以创建字符串的新实例 - 并且每次使用宏时都可能为该新实例分配内存。

另一种方法,它只分配一次字符串:

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

答案 4 :(得分:1)

输入不合法。

如果要存储版本号,我建议将其编码为32位int并在结构分配时填写。

答案 5 :(得分:1)

我可能会问为什么要将它存储在结构中?它是通过网络发送的吗?

直到存储为止,编译器(或链接器,我不确定)可以在数据部分中的一个位置存储相同的字符串,如果多次使用相同的字符串,那么使用宏并不是一个坏处事情。就个人而言,我会做这样的事情:

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

如果是针对类似插件的DLL体系结构,那么函数版本是最合适的(例如以下内容:

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

答案 6 :(得分: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