Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 禁用的行宏?_C++_Macros - Fatal编程技术网

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__);