一个函数会起作用。完整的工作示例:
#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*
它在函数本身中进行操作,并且仍然可能被宏隐藏。