如何在不使用对象的情况下连接字符串、整数和浮点数?
Posted
技术标签:
【中文标题】如何在不使用对象的情况下连接字符串、整数和浮点数?【英文标题】: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 不会捕捉到这些。
【参考方案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
宏将它们“字符串化”,然后使用相邻的字符串连接。
虽然不能使用变量,但只能使用文字值。
【讨论】:
以上是关于如何在不使用对象的情况下连接字符串、整数和浮点数?的主要内容,如果未能解决你的问题,请参考以下文章