如何使预处理器为 __LINE__ 关键字生成字符串?

发布于 2024-11-01 09:18:22 字数 432 浏览 1 评论 0原文

__FILE__ 被 C++ 预处理器替换为“MyFile.cpp”。 我希望将 __LINE__ 替换为“256”字符串而不是 256 整数。 不使用我自己编写的函数,例如

toString(__LINE__);

这可能吗?我该怎么做呢?

VS 2008

编辑 我想自动查找并替换

throw std::runtime_error(std::string("exception at ") + __FILE__ + " "+__LINE__);

源代码中的所有 throw; 语句。如果我使用宏或函数将 __LINE__ 转换为字符串,我需要手动修改每个源文件。

__FILE__ is replaced with "MyFile.cpp" by C++ preprocessor.
I want __LINE__ to be replaced with "256" string not with 256 integer.
Without using my own written functions like

toString(__LINE__);

Is that possible? How can I do it?

VS 2008

EDIT I'd like to automatically Find and Replace all throw; statements with

throw std::runtime_error(std::string("exception at ") + __FILE__ + " "+__LINE__);

in my sources. If I use macro or function to convert __LINE__ into a string I'll need to modify each source file manually.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

红墙和绿瓦 2024-11-08 09:18:22

您需要双重扩展技巧:

#define S(x) #x
#define S_(x) S(x)
#define S__LINE__ S_(__LINE__)

/* use S__LINE__ instead of __LINE__ */

几年后的附录:稍微特意避免可能在异常处理路径中分配内存的操作是一个好主意。鉴于上述内容,您应该能够编写

throw std::runtime_error("exception at " __FILE__ " " S__LINE__);

在编译时而不是运行时执行字符串连接的代码。它仍然会在运行时构造一个 std::string (隐式),但这是不可避免的。

You need the double expansion trick:

#define S(x) #x
#define S_(x) S(x)
#define S__LINE__ S_(__LINE__)

/* use S__LINE__ instead of __LINE__ */

Addendum, years later: It is a good idea to go a little out of one's way to avoid operations that may allocate memory in exception-handling paths. Given the above, you should be able to write

throw std::runtime_error("exception at " __FILE__ " " S__LINE__);

which will do the string concatenation at compile time instead of runtime. It will still construct a std::string (implicitly) at runtime, but that's unavoidable.

别挽留 2024-11-08 09:18:22

编辑:为了响应其他答案的请求,我添加了一个非宏版本:

#include <iostream>
#include <boost/lexical_cast.hpp>
#include <string>

#define B(x) #x
#define A(x) B(x)

void f(const char *s) {
std::cout << s << "\n";
}

int main() {

   f(A(__LINE__));
   f(boost::lexical_cast<std::string>(__LINE__).c_str());
}

EDIT: In response to request on the other answer, I added a non-macro version:

#include <iostream>
#include <boost/lexical_cast.hpp>
#include <string>

#define B(x) #x
#define A(x) B(x)

void f(const char *s) {
std::cout << s << "\n";
}

int main() {

   f(A(__LINE__));
   f(boost::lexical_cast<std::string>(__LINE__).c_str());
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文