我正在玩预处理器和c。试图实现我自己的事件和分级系统。 但是我面临一个问题。我试图静态定义可以初始化的“模块”,以及一些事件,这些事件也是事先静态定义的。对于我正在使用的活动COUNTER,它的作品很漂亮。但我不想混用模块ID和事件ID。多个__COUNTER__ C
所以我想要实现一个简化版本:
hierarchy.h
#define HIERARCHY_DEFINE(NAME) int hierarchyId = __COUNTER__
event.h
#define EVENT_REGISTER(NAME) int eventId = __COUNTER__
的main.c
#include "event.h"
#include "hierarchy.h"
EVENT_REGISTER(EventOne);
HIERARCHY_DEFINE(ModuleOne);
EVENT_REGISTER(EventTwo);
int main(void){
printf("events(%d, %d) modules(%d)\n",EventOne,EventTwo,ModuleOne);
return 1;
}
这将打印出:
events(0, 2) modules(1)
当我试图实现:
events(0, 1) modules(0)
我环顾四周,人们说我不能创建我自己的计数器。并看到了增强计数器,但是这并没有达到我想要的。
有没有人知道我该如何处理这种情况?
谢谢!
编辑:什么我的代码实际上看起来像
struct Event{
uint8_t eventId;
uint8_t * data;
const char * description;
};
#define EVENT_REGISTER(eventName, desc)\
static Event eventName = {.eventId = __COUNTER__, .data = 0, .description = desc }
EVENT_REGISTER(Timer_5, "Timer 5 hZ");
如果ID是静态定义的,它们可以进入'enum',对吧? –
所以你想要一个事件计数器,一个模块,这两个计数器应该是分开的?那么为什么不使用两个变量,初始化为零并在宏中增加?例如。 'int eventId = eventIdCounter ++;' –
他们可以,但是我喜欢尽可能简单地注册一个事件。现在只有一条线就足够了。不想一直添加或删除或更改事件时必须更改枚举 – Elamre