C++将整数转换为字符串内联

3

我的问题似乎很基础,但我找不到解决方法。我需要编写一个代码来帮助调试,并报告异常抛出的行和位置。问题在于__LINE__是一个int值,在以下代码中我无法将其转换为字符串,使用了std::string(line):

#pragma once

#include <stdexcept>
#include <cstring>


class CRuntime_error_line: public std::runtime_error
{
public:
    CRuntime_error_line(const char * msg, const char * file,int line)
        :runtime_error(std::string(msg)+" @"+":"+std::string(line)){}
};

#define runtime_error_line(msg) CRuntime_error_line(msg,__FILE__,__LINE__)

看起来std::string(line)无法将int转换为字符串,而在线上提出的其他解决方案无法在行内实现,我不知道如何在第二行调用基础构造函数!

编译器输出:

log.h: 在构造函数‘CRuntime_error_line::CRuntime_error_line(const char*,const char*,int)’中: log.h:10:124: 错误:从‘int’到‘const char*’的无效转换[-fpermissive] CRuntime_error_line(const char * msg,const char * file,int line): runtime_error(std::string(msg)+“@”+:“+std :: string(line)){}

(使用g++和Linux环境)

编辑:

应该这样调用宏:

throw runtime_error_line("Invalid somethihng ...!");

4
std::to_string(line) - Borgleader
错误:‘to_string’不是‘std’的成员 - barej
1
包含<string>没有任何变化。错误:‘to_string’不是‘std’的成员。C++11适用于我的代码吗? - barej
1
@barej 是的,to_string 是来自 C++11。 - Jonathan Mee
1
@barej 你必须明确地启用C++11支持:g++ -std=c++11 -o prog.x prog.cpp - Jonathan Mee
显示剩余3条评论
3个回答

3

正如Borgleader所建议的那样,std::to_string是解决方案。它还将为您构造一个临时的std::string,因此无需从msg构造临时字符串:

#pragma once

#include <stdexcept>
#include <cstring>
#include <string> // Add this to support std::to_string


class CRuntime_error_line: public std::runtime_error
{
public:
    CRuntime_error_line(const char* msg, const char* file, int line)
        : runtime_error(msg + " @:"s + std::to_string(line)){} // Use std::to_string here
};

#define runtime_error_line(msg) CRuntime_error_line(msg, __FILE__, __LINE__)

即使没有C++11,仍然可以实现这个功能,只是不够简洁:

#pragma once

#include <stdexcept>
#include <cstring>
#include <sstream> // Use to include std::ostringstream    

class CRuntime_error_line: public std::runtime_error
{
public:
    CRuntime_error_line(const char* msg, const char* file, int line)
        : runtime_error(static_cast<std::ostringstream&>(std::ostringstream() << msg << " @:" << line).str()){} // Use std::ostringstream here
};

#define runtime_error_line(msg) CRuntime_error_line(msg, __FILE__, __LINE__)

似乎g++编译器对于std::to_string无法识别! - barej
log.h: In constructor ‘CRuntime_error_line::CRuntime_error_line(const char*, const char*, int)’: log.h:12:40: error: ‘to_string’ is not a member of ‘std’ : runtime_error(msg + (" @:" + std::to_string(line))){} // Use std::to_string here - barej
1
你是否添加了:--std=c++11? - gosom
代码编译通过,但输出有问题:0x401938 @:47。这不是我期望看到的! - barej
1
非常感谢,请在您的解决方案末尾添加 g++ -std=c++11 -o prog.x prog.cpp,以便其他遇到类似问题的人可以使用。 - barej

1
在这种情况下,使用
可能更好。
#define STRING_DEFINE1(x) #x
#define STRING_DEFINE(x) STRING_DEFINE1(x)
...
CRuntime_error_line(msg,__FILE__,STRING_DEFINE(__LINE__))

创意点子,尽管应用范围有限。 - barej
或者更好地定义RUNTIME_ERROR_MAGIC,即__FILE__ " " STRING_DEFINE(__LINE__),然后您只需处理一个字符串字面量。 - Martin Bonner supports Monica

1
我能想到的最简单的方法就是自己编写一个to_string函数:
#include <sstream>

std::string to_string(int i)
{
    std::ostringstream os;
    os << i;
    return os.str();
}

然后按照其他人建议的方式进行调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接