为什么必须在第一行设置_GLIBCXX_DEBUG?

use*_*940 2 c++ gcc g++

我正在以下无用程序中的 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 上解决问题,我无法传递编译器标志或修改问题的第一行。

eer*_*ika 6

为什么必须在第一行设置调试模式?

因为受宏影响的是标准库头。如果之前包含了标头,那么包含的定义将不会看到宏定义。考虑以下示例,并想象它是标准标头中包含的函数定义:

#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下标运算符来代替。即使没有调试模式,它也会诊断越界访问。