初始化结构体时如何增加值?

问题描述 投票:0回答:1

使用

unsigned short id
使用
#define
...

初始化结构体

static unsigned short mId = 0;

typedef struct
{
    /* data */
    unsigned short id;
    const char *name;
    bool enabled;
} Machine;

#define CREATE_MACHINE(_mName_) Machine m##_mName_ = {mId++, #_mName_, false};

如何为下一个实例初始化增加

mId
?初始化程序中不允许使用
mId++

c
1个回答
0
投票

一个函数将会起作用。 完整的工作示例:

#include <stdio.h>
#include <stdbool.h>

static unsigned short mId = 0;

typedef struct
{
    /* data */
    unsigned short id;
    const char *name;
    bool enabled;
} Machine;

static Machine make_machine(const char * name) {
    // lock mutexes, atomic operations, etc.
    unsigned short next_id = mId++;
    // unlock mutexes if necessary
    Machine ret = {next_id, name, false};
    return ret;
}

#define CREATE_MACHINE(_mName_) Machine m##_mName_ = make_machine(#_mName_)

int main() {
    CREATE_MACHINE(hello);
    CREATE_MACHINE(world);
    printf("%u: %s\n", mhello.id, mhello.name);
    printf("%u: %s\n", mworld.id, mworld.name);
    return 0;
}

因为函数不受相同方式的约束,所以我们可以在那里做额外的工作,例如增量

mId
。 如果您想使用不同的递增 ID 变量,
make_machine
可以采用在函数本身内操作的
unsigned short*
,并且仍然可以被宏隐藏。

© www.soinside.com 2019 - 2024. All rights reserved.