【问题标题】:How to concatenate strings, integers and floating point numbers without using objects?如何在不使用对象的情况下连接字符串、整数和浮点数?
【发布时间】:2019-06-11 10:30:44
【问题描述】:

我想在故障转储文件中添加信息,以防我的应用程序崩溃。

因此我创建了一个__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);

有人有想法吗?
谢谢

【问题讨论】:

  • __try 不是标准的。可能是编译器扩展。您需要指定您使用的编译器以及为什么使用这些而不是标准的try catch
  • @bolov 它是结构化异常处理,用于捕获 Windows 异常的 MSVC 扩展(例如 DivisionByZero)。 try/catch 不会捕捉到这些。

标签: c++ string visual-c++ type-conversion concatenation


【解决方案1】:

到目前为止,最简单的解决方案是简单地回避问题。只需将未转换的确切参数转发到执行实际写入文件的(模板)函数。由于__catch 不在模板函数本身中,而是在堆栈的上一级,所以您是安全的。

【讨论】:

  • 函数ShowCrashdumpInformation()确实将字符串写入外部文件,它使用LPCTSTR作为输入。目前这是用__FUNCTION__ 填写的,但我想添加更多内容,因此我提出了问题。 (供您参考,我的代码中有 300 多个地方都有这样的结构,我正在寻找在这种特殊情况下添加更多信息)
  • @Dominique:因此,针对特定情况,您可以在两者之间添加template<typename... T> void YourClass::ShowMoreCrashdumpInformation(LPCWSTR fun, T... args)
【解决方案2】:

您可以使用预处理器宏来“字符串化”标准__LINE__ 宏,并依赖编译器相邻的字符串文字连接。

大概是这样的:

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

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

...

ShowCrashdumpInformation(_T(FILE_FUNCTION_LINE))

只要您有文字值,您就可以使用STR 宏将它们“字符串化”,然后使用相邻的字符串连接。

虽然不能使用变量,但只能使用文字值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 2018-02-14
    • 2021-02-11
    相关资源
    最近更新 更多