我有一系列在不同领域的C程序中使用的全局事件。任何区域都可以创建一个任意事件来适当地挂钩和处理。 我需要一种方法来定义可变数量的任意常量,这些常量是唯一的和全局的。除了卫生,这大约是我希望的工作:
event_handler.h
extern int last_event_ = 0;
#define NEW_EVENT() (last_event_++)
first_handler.h
#define FIRST_EVENT NEW_EVENT()
second_handler.h
#define SECOND_EVENT NEW_EVENT()
的main.c
#include "first_handler.h"
#include "second_handler.h"
int main(int argc, char **argv) {
printf("Second event number: %d\n", SECOND_EVENT);
printf("Second event number: %d\n", SECOND_EVENT);
return 0;
}
但由于执行宏的方式,这不能按预期工作。当它应该打印出相同的数字时,导致它打印0然后1。
答案 0 :(得分:0)
看起来可以使用__COUNTER__
预定义宏来完成。
答案 1 :(得分:0)
如果我理解正确,你需要一组可以增加和阅读的计数器。
可能的解决方案:创建一个名称中带有公共前缀的全局变量系列;并用宏处理它们。例如:
#include <stdio.h>
#define EVENT_VAR(name) (EVENT ## name)
#define DEFINE_EVENT(name) int EVENT_VAR(name)
#define DECLARE_EVENT(name) extern DEFINE_EVENT(name)
#define EVENT_HAPPENED(name) (++ EVENT_VAR(name))
// in one of the compilation units:
DEFINE_EVENT(first);
DEFINE_EVENT(second);
// in header first_handler.h:
// DECLARE_EVENT(first);
int main() {
EVENT_HAPPENED(first);
EVENT_HAPPENED(first);
// EVENT_HAPPENED(frist); // compile-time checked
printf("%d %d\n", EVENT_VAR(first), EVENT_VAR(second));
}