C++ 禁用的行宏?
我想做一些异常处理。我计划使用C++ 禁用的行宏?,c++,macros,C++,Macros,我想做一些异常处理。我计划使用\uuu行和\uu文件宏 我有一些header Vectors.hpp,在其中我实现了向量结构的一些类。在这个类中,我实现了操作符[],每次将这个操作符与越界索引一起使用时,我都会抛出一个异常。我在一些source test.cpp中测试这个类。然后我希望能够看到test.cpp中发生这种情况的确切行 但是,我知道每次包含某些标题时,\uuuuuu LINE\uuuuu宏都会被禁用,因此我得到的是Vectors.hpp中的行,我在其中处理异常,而不是test.cpp
\uuu行
和\uu文件
宏
我有一些header Vectors.hpp,在其中我实现了向量结构的一些类。在这个类中,我实现了操作符[]
,每次将这个操作符与越界索引一起使用时,我都会抛出一个异常。我在一些source test.cpp中测试这个类。然后我希望能够看到test.cpp中发生这种情况的确切行
但是,我知道每次包含某些标题时,
\uuuuuu LINE\uuuuu
宏都会被禁用,因此我得到的是Vectors.hpp中的行,我在其中处理异常,而不是test.cpp中的行。有什么好办法可以解决这个问题吗?或者,如何实现自己的\uuuuuuuuuuuuuuuu
宏?该\uuuuuuuuuuuuuuuuu
宏从不被禁用。它在您编写它的地方展开。有两种方法可以编写代码(更准确地说,有两种方法可以生成令牌):
- 手动编写
- 使用预处理器编写代码
foo.cpp
(只是示例,实际上这是非常糟糕的代码)
然后,\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
始终是foo.cpp
这是因为宏是在使用它们的地方展开的。解决方案是找到一种方法,将它们扩展到您想要的位置,唯一的方法是定义另一个宏:
#define safe_subscript(foo, index) \
try {foo[index];} \
catch(...) { std::cout << __LINE__ << '\n'; }
....
safe_subscript(foo, 256);
如果您的用户收到异常,他/她/它应该在出现编程错误的地方进行调试。您可以将当前行作为异常的一部分传递。将您的异常定义为
struct MyException : public std::exception {
MyException(const char* line) : errorLine(line);
const char* errorLine;
};
并按如下方式使用:
if (isError())
throw MyException(__LINE__);
很简单,当捕获异常时,您必须添加该信息,通常我们创建一个扩展std::exception的类,该类带有一些附加属性,用于装载一条清晰的错误消息,其中包括
\uuuuuuuuuuuuuuuuuuuuuuu行
,\uuuuuuuuuuuuuuu文件
甚至\uuuuuuuuuuuuuuuuuuu函数
这一条还回答说:
也许这个问题与您的问题类似
struct MyException : public std::exception {
MyException(const char* line) : errorLine(line);
const char* errorLine;
};
if (isError())
throw MyException(__LINE__);