Как использовать препроцессор для вычисления и хранения хэшей во время компиляции? - PullRequest
1 голос
/ 28 мая 2009

У меня есть собственная программа C ++, которая использует «очереди событий» для выполнения функций в разных потоках. Я выделяю класс «события» в куче и помещаю его в одну из очередей моих потоков для выполнения.

Все это прекрасно работает, но очень трудно отследить происхождение этих "событий". Я хотел бы, чтобы каждое «событие» хранило некоторую информацию, относящуюся к тому, откуда оно пришло. Прямо сейчас я использую встроенный _ReturnAddress() для этого, но я также хотел бы иметь строку имени файла и номер строки. Я хорошо использую макросы для планирования моих "событий".

Конечно, я не хочу платить за эти строки.

Есть ли способ создать препроцессор и создать дамп для создания карты "id" => "file, line", где "id" будет каким-то уникальным числом, увеличенным каждый раз, когда мой макрос будет раскрыт? Я мог бы сохранить этот идентификатор как мой источник.

Или, может быть, вычислить очень короткий хэш имени файла, чтобы я мог использовать его во время выполнения?

Любые идеи приветствуются.

Ответы [ 3 ]

4 голосов
/ 28 мая 2009

Для идентификации вы можете использовать __COUNTER__.

С http://msdn.microsoft.com/en-us/library/b0084kay(VS.80).aspx:

Расширяется до целого числа, начиная с 0 и увеличивая на 1 каждый раз, когда это используется в компиляции.

__FILE__ и __LINE__ могут использоваться для отслеживания места, где было выделено событие.

Но почему вы хотите отследить происхождение этих событий? Если это для целей отладки, вам может понадобиться встроить трассировку стека, собранную с помощью StackWalk64, в ваш класс в специальном режиме отладки - это даст вам гораздо больше полезной информации, чем просто место происхождения.

3 голосов
/ 28 мая 2009

Напишите свой собственный препроцессор.

Не обязательно так сложно, просто анализирует файл .cpp и ищет синтаксис, который вы определили сами. Найдя его, добавьте имя файла и строку (препроцессор должен будет посчитать количество новых строк) в некоторый файл журнала. Это должно было бы расширить ваш собственный макрос в C ++, хотя. Запишите все во временный файл, который вы, в свою очередь, передадите «настоящему» компилятору.

Ура!

1 голос
/ 28 мая 2009

Оформить Boost.Preprocessor . Это набор макросов, предназначенный только для заголовков, для выполнения мощных задач со стандартным препроцессором C.

Это довольно сложно (я не претендую на то, чтобы понять это), но я думаю, что оно может делать то, что вы хотите. Документы здесь и здесь .

...