Глобальное увеличение констант в C

#c #gcc #macros

#c #gcc #макросы

Вопрос:

У меня есть серия глобальных событий, которые используются в программе 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: %dn", SECOND_EVENT);
    printf("Second event number: %dn", SECOND_EVENT);
    return 0;
}
 

Однако это работает не так, как ожидалось, из-за способа выполнения макросов. Заставляя его выводить 0, а затем 1, когда он должен выводить одно и то же число.

Комментарии:

1. вы хотите enum ?

2. Я хочу очень произвольное количество констант, поэтому перечисление слишком ограничено.

3. Что вы ожидаете, что произойдет, когда first_handler.h будет #включен из нескольких исходных файлов? Каждый раз генерировать разное число или одно и то же?

4. FIRST_EVENT должно быть одинаковым для всех включенных. Возможно ли это вообще?

5. статика инициализируется нулем. просто дайте каждому событию свою собственную статическую переменную. назначайте его только в том случае, если он равен нулю.

Ответ №1:

Похоже, это можно сделать с __COUNTER__ помощью предопределенного макроса.

Ответ №2:

Если я правильно понимаю, вам нужен набор счетчиков, которые вы можете увеличить и прочитать.

Возможное решение: создайте семейство глобальных переменных с общим префиксом в имени; и обрабатывайте их с помощью макросов. Пример:

 #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 %dn", EVENT_VAR(first), EVENT_VAR(second));
}