1.问题概述

  • 今天组内小伙伴在调试算法接口时,总是在算法接口崩溃,发现vs提示信息为vector too long…结果算法人员告诉设置预编译器定义 _HAS_ITERATOR_DEBUGGING=0取消该宏定义。我擦,这是什么骚操作,还行这么玩,一看就感觉有问题,结果为了证明这样是取消不了该宏的定义的,特此进行了一下验证;
    在这里插入图片描述

2. main.cpp源代码(vs2017环境,其他vs环境都可以):

#ifdef _HAS_ITERATOR_DEBUGGING
#define x_1  1
#pragma message ("#define x_1  1")
#endif

#ifdef _HAS_ITERATOR_DEBUGGING
#define y_1  1
#pragma message ("#define y_1  1")
#endif

#include <iostream>

int main()
{
    //int x = 0;
    #ifdef _HAS_ITERATOR_DEBUGGING
    {
        printf("#ifdef _HAS_ITERATOR_DEBUGGING\n");
        printf("x_z = %d\n", _HAS_ITERATOR_DEBUGGING);
        printf("x_1 = %d\n", x_1);
        printf("y_1 = %d\n", y_1);
    }
    #endif

    if (_HAS_ITERATOR_DEBUGGING == 0)
    {
        printf("if (_HAS_ITERATOR_DEBUGGING == 0)\n");
        printf("x_z = %d\n", _HAS_ITERATOR_DEBUGGING);
        printf("x_1 = %d\n", x_1);
        printf("y_1 = %d\n", y_1);
    }

    if (_HAS_ITERATOR_DEBUGGING == 1)
    {
        printf("if (_HAS_ITERATOR_DEBUGGING == 1)\n");
        printf("x_z = %d\n", _HAS_ITERATOR_DEBUGGING);
        printf("x_1 = %d\n", x_1);
        printf("y_1 = %d\n", y_1);
    }

    if (_HAS_ITERATOR_DEBUGGING == 2)
    {
        printf("if (_HAS_ITERATOR_DEBUGGING == 2)\n");
        printf("x_z = %d\n", _HAS_ITERATOR_DEBUGGING);
        printf("x_1 = %d\n", x_1);
        printf("y_1 = %d\n", y_1);
    }

   // printf("%d\n", vtkBooleanMacro(x,=,1));

    std::cout << "Hello World!\n";
    getchar();
}

3. 预处理器定义为_HAS_ITERATOR_DEBUGGING=0

3.1 查看重新编译log

  • 该宏被编辑器预定义_HAS_ITERATOR_DEBUGGING 为 0,但是该 _HAS_ITERATOR_DEBUGGING 还是属于被预定义状态;
    在这里插入图片描述

3.2 查看运行结果

  • #ifdef _HAS_ITERATOR_DEBUGGING 判断已经被预定义,或者使用if(_HAS_ITERATOR_DEBUGGING == 0/1)这种骚操作很少,起不到取消该_HAS_ITERATOR_DEBUGGING 的定义
    在这里插入图片描述

4. 预处理器定义为_HAS_ITERATOR_DEBUGGING=1

在这里插入图片描述

4.1 查看重新编译log

  • 该宏被编辑器预定义_HAS_ITERATOR_DEBUGGING 为 1,但是该 _HAS_ITERATOR_DEBUGGING 还是属于被预定义状态;
    在这里插入图片描述

4.1 查看运行结果

在这里插入图片描述

5. 预处理器定义为_HAS_ITERATOR_DEBUGGING=2

在这里插入图片描述

5.1 查看重新编译log

  • 编译阶段直接报错,如图;
    在这里插入图片描述
    在这里插入图片描述

6. 总结

  • 只要在预处理器界面中定义了_HAS_ITERATOR_DEBUGGING宏,即编辑器在编辑阶段便会定义该宏。一般不会再对该宏执行=赋值操作(应该是认知错误,想取消该宏的定义);
  • 如果真的想玩骚操作、乱七八糟非正常设置,那么也只能设置为0/1(很少有这么使用的);而且在程序中也只能使用if(_HAS_ITERATOR_DEBUGGING == xxxx)等形式进行判断,#ifdef _HAS_ITERATOR_DEBUGGING 永远都是有效的,被预定义的宏;
  • 想取消某个宏的设置,配置成_HAS_ITERATOR_DEBUGGING=0是起不到取消宏定义作用的;真的想取消还是要去除该宏的配置;

版权声明:本文为Windgs_YF原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Windgs_YF/article/details/126125390