#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));
}