使用
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++
。
一个函数将会起作用。 完整的工作示例:
#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*
,并且仍然可以被宏隐藏。