#define DLT_LOG(...) prepare_String(__VA_ARGS__)
template<class... Msg> std::string prepareMsg(Msg... message)
{
std::stringstream streamMsg;
(streamMsg << ... << message) << std::endl;
return streamMsg.str();
}
int main()
{
int some_integer_value = 10;
float some_float_value = 3.141;
uint8_t some_status = 0;
LOG(1, "this is a message", some_float_value, some_integer_value, some_status );
LOG("an example message");
}
在执行上述函数时,我面临“检测到堆栈粉碎****”。 我的观点是,当内存地址传递到上面的宏时,它会导致此错误。
预期输出:
1 这是一条消息 10 3.141 0
示例消息
如果您无法使用 C++20 或库,那么您根本不需要宏(如果可以的话甚至避免使用它们)。然后记录代码可能如下所示:
#include <iostream>
#include <sstream>
#include <string_view>
template<typename arg_t, typename... args_t>
void log(std::ostream& os, arg_t&& arg, args_t&&... args)
{
os << std::forward<arg_t>(arg);
((os << " " << std::forward<args_t>(args)), ...); // fold expression that inserts an extra space
}
int main()
{
int some_integer_value = 10;
float some_float_value = 3.141f;
uint8_t some_status = 0;
log(std::cout, 1, "this is a message", some_float_value, some_integer_value, some_status );
return 0;
}