- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想做一些异常处理。我计划使用 __LINE__
和 __FILE__
宏。
我有一些 header Vectors.hpp,我在其中为 vector 结构实现了一些类。在这个类中,我实现了 operator []
并且我想在每次将此运算符与越界索引一起使用时抛出异常。我在一些源代码 test.cpp 中测试了这个类。然后我希望能够在 test.cpp 中看到发生这种情况的确切行。
但是我知道 __LINE__
宏在每次包含一些 header 时都会被禁用,所以我得到的是 Vectors.hpp 中我处理异常的行而不是 test.cpp 中的行.有解决这个问题的好方法吗?或者,如何实现自己的 __LINE__
宏?
最佳答案
__LINE__
宏永远不会被禁用。它会在您编写的地方展开。有两种写代码的方式(更准确地说,有两种产生token的方式):
如果你有这样的文件foo.cpp
(只是示例,实际上那是非常糟糕的代码)
class Foo {
public:
Frob operator[] (size_t) { throw __LINE__ }
};
那么 __LINE__
总是 3 而 __FILE__
总是 foo.cpp
。
那是因为宏在使用它们的地方展开了。解决方案是找到一种方法将它们扩展到您想要的地方,唯一的方法是定义另一个宏:
#define safe_subscript(foo, index) \
try {foo[index];} \
catch(...) { std::cout << __LINE__ << '\n'; }
....
safe_subscript(foo, 256);
但如您所见,这会导致代码和变通方法非常丑陋。
真正的解决方案:只要在越界时抛出异常(throw std::out_of_range
),或者像 the standard library 那样做:
T& operator[] (size_type i) { return store_[i]; }
T& at (size_type i) { if (i>size_) throw std::out_of_range("crap");
return store_[i]; }
T operator[] (size_type i) const { return store_[i]; }
T at (size_type i) const { if (i>size_) throw std::out_of_range("crap");
return store_[i]; }
如果您的用户收到异常,他应该在他/她/它发生编程错误的地方进行调试。
关于c++ - 禁用 __LINE__ 宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11743808/
我已经创建了一个用于错误跟踪的宏。这是一个简化版本: #include #define ERR(...) \ printf("
这个问题在这里已经有了答案: Creating C macro with ## and __LINE__ (token concatenation with positioning macro) (
我在头文件中有一个函数: template inline void log() {} 然后我尝试这个技巧来使它更容易使用: #define LOG_LINE log() 然后在 .cpp 文件中我这
我可以将 __LINE__ 用作方法参数就好了,但我想要一种在使用字符串的函数中使用它的简单方法。 例如说我有这个: 11 string myTest() 12 { 13 if(!
基本上,我的问题是 this除了 perl 而不是 PHP。 我知道warn() 管理它,但是warn() 是核心perl,所以我理解它是否通常不可能。 附录(以防链接最终失败) 有一个功能 sub
在 C/C++ 中,是否有一个宏会告诉我相对于找到该宏的函数开头的行号,而不是相对于文件开头的行号? 最佳答案 不,但是您可以通过创建行偏移来做一些等效的事情: int func(char *s) {
考虑一下我写的这个简短的程序: #include template constexpr int add(const int& a, const int& b) {
在另一篇文章 (Scala, Maven, and preprocessors) 中,我询问了有关使用 m4 等工具预处理 Java 和 Scala 的问题。我需要添加 __FILE__ 和 __LI
假设,我从下面的代码构建了一个独特的函数体: #define TOKENPASTE(x, y) x ## y #define TOKENPASTE2(x, y) TOKENPASTE(x, y) #d
所以,我感兴趣的是一个类似于 __LINE__ 的宏,但不是返回行号,而是返回给定行内的位置。 它可以是行中的列或字符位置。例如,在代码中: #define THISCHAR int main(voi
我阅读了有关使用 Cppreference 的宏的信息. __LINE__ : expands to the source file line number, an integer constant,
是否有可能通过LINE 宏获取在线报告的整个字符串。示例代码: #include #define LOG(lvl) pLog(lvl, __LINE__, __FILE__) pLog(const
在 C++ 中调试的一个有用的打印是 std::cout << __LINE__ << std::endl; 当然你可以简单地打印一个带有行号的字符串,例如: std::cout << "this i
我尝试使用以下方法打印当前代码的行号: #include void err (char *msg) { printf ("%s : %d" , msg , __LINE__); } int
我不明白以下程序的输出: #include #define FOO std::cout 2: 3: #define FOO std::cout #define __LINE__ 3 #defi
有没有什么方法可以在 Javascript 中获取源代码行号,比如 C 或 PHP 的 __LINE__? 最佳答案 有一种方法,虽然更昂贵:抛出异常,立即捕获它,并从其堆栈跟踪中挖掘出第一个条目。参
我想做一些异常处理。我计划使用 __LINE__ 和 __FILE__ 宏。 我有一些 header Vectors.hpp,我在其中为 vector 结构实现了一些类。在这个类中,我实现了 oper
我正在编写一些我想集成到库中的代码。我希望它没有外部依赖性并且符合标准。我想使用模板创建一个唯一的类型以允许编译时类型检查。 更新: 下面的代码来自msdn,这不是我尝试做的。我尝试做的是在用户每次使
我正在编写一个简单的宏来显示 TRACE 信息。 这是我用的, #ifdef __DEBUG__ #define TRACE { PrintErrorMsg("Trace exception at
为什么 __LINE__ 根据它是在类似函数的宏还是在常规函数中使用而进行不同的评估? 例如: #include #define A() printf("%d\n",__LINE__); int ma
我是一名优秀的程序员,十分优秀!