全局增加C中的常数

时间:2014-06-25 21:37:34

标签: c gcc macros

我有一系列在不同领域的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。

2 个答案:

答案 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));
}