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
int main ( )
{
# 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) ;
}
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是起不到取消宏定义作用的;真的想取消还是要去除该宏的配置;