【genius_platform软件平台开发】第七十六讲: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();
}

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是起不到取消宏定义作用的;真的想取消还是要去除该宏的配置;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

隨意的風

如果你觉得有帮助,期待你的打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值