Как объединить строки, целые числа и числа с плавающей точкой без использования объектов? - PullRequest
1 голос
/ 11 июня 2019

Я хотел бы добавить информацию в файл аварийного дампа на случай сбоя моего приложения.

Поэтому я создал предложение __try - __except:

__try
{
  Do_Something();
}
__except (ShowCrashdumpInformation(_T(__FUNCTION__));

Вместо __FUNCTION__ я хотел бы добавить больше информации, но как я могу это сделать?

Самый простой способ - использовать CString, но это заблокировано из-за ошибки компилятораC2712 (Невозможно использовать __try в функциях, которые требуют разматывания объекта).

Итак, я хотел бы использовать строки LPCTSTR (которые широко используются в моем приложении).

Какрезультат должен выглядеть следующим образом (CString альтернатива):

CString temp; temp.Format(_T("Do_Something, int=[%d], float=[%f], string=[%s]), iParam, fParam, strParam);

У кого-нибудь есть идеи?
Спасибо

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Безусловно, самое простое решение - просто обойти проблему.Просто передайте точные аргументы, не преобразованные, в функцию (шаблона), которая выполняет фактическую запись в файл.Поскольку __catch находится не в самой функции шаблона, а на один уровень выше стека, вы в безопасности.

1 голос
/ 11 июня 2019

Вы можете использовать макросы препроцессора для «строкового преобразования» стандартного макроса __LINE__ и полагаться на смежную строково-буквенную конкатенацию компилятора.

Возможно, что-то вроде этого:

#define STRx(x) #x
#define STR(x) STRx(x)

#define FILE_FUNCTION_LINE (__FILE__ ":" __FUNCTION__ ":" STR(__LINE__))

...

ShowCrashdumpInformation(_T(FILE_FUNCTION_LINE))

Пока у вас есть литеральные значения, вы можете использовать макрос STR для их «строкового преобразования», а затем использовать конкатенацию соседних строк.

Однако использование переменных невозможно, только использование литеральных значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...