当前位置:   article > 正文

【genius_platform软件平台开发】第七十六讲:vs预处理器定义的牛逼写法!!!!

vs预处理器定义

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();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

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是起不到取消宏定义作用的;真的想取消还是要去除该宏的配置;
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/756563
推荐阅读
  

闽ICP备14008679号