我正在以下无用程序中的 gcc 中设置调试模式:
#define _GLIBCXX_DEBUG 1
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<int> v{1,2,3};
for(int i=0; i<100000000000000;i++)
cout<<v[i];
}
Run Code Online (Sandbox Code Playgroud)
该程序让我知道我的索引超出范围。但是,如果我翻转前两行的顺序,则不会收到此类错误消息(#include 在 #define 之前)。为什么是这样?有没有办法在程序的另一行上切换调试模式(没有编译器标志)?我这么问是因为我正在 Leetcode.com 上解决问题,我无法传递编译器标志或修改问题的第一行。
为什么必须在第一行设置调试模式?
因为受宏影响的是标准库头。如果之前包含了标头,那么包含的定义将不会看到宏定义。考虑以下示例,并想象它是标准标头中包含的函数定义:
#define _GLIBCXX_DEBUG 1
inline void foo() {
#ifdef _GLIBCXX_DEBUG
std::cout << "debug mode is enabled";
#else
std::cout << "debug mode is not enabled";
#endif
}
Run Code Online (Sandbox Code Playgroud)
相对:
inline void foo() {
#ifdef _GLIBCXX_DEBUG
std::cout << "debug mode is enabled";
#else
std::cout << "debug mode is not enabled";
#endif
}
#define _GLIBCXX_DEBUG 1
Run Code Online (Sandbox Code Playgroud)
有没有办法在程序的另一行上切换调试模式(没有编译器标志)?
不是在包含标准标头之后。
在这种情况下,您可以使用std::vector::at
下标运算符来代替。即使没有调试模式,它也会诊断越界访问。
归档时间: |
|
查看次数: |
4909 次 |
最近记录: |