为什么在 Visual Studio 2015 上弹出“警告 C4804:'>':在操作中不安全地使用类型 'bool'”?
Why the `warning C4804: '>': unsafe use of type 'bool' in operation` is popping on Visual Studio 2015?
为什么 warning C4804: '>': unsafe use of type 'bool' in operation
在 Visual Studio 2015 年流行?
如果您 运行 此代码:
#include <iostream>
#include <cstdlib>
int main( int argumentsCount, char* argumentsStringList[] )
{
#define COMPUTE_DEBUGGING_LEVEL_DEBUG 0
#define COMPUTE_DEBUGGING_DEBUG_INPUT_SIZE 32
int inputLevelSize;
int builtInLevelSize;
inputLevelSize = strlen( "a1" );
builtInLevelSize = strlen( "a1 a2" );
if( ( 2 > inputLevelSize > COMPUTE_DEBUGGING_DEBUG_INPUT_SIZE )
|| ( 2 > builtInLevelSize > COMPUTE_DEBUGGING_DEBUG_INPUT_SIZE ) )
{
std::cout << "ERROR while processing the DEBUG LEVEL: " << "a1" << std::endl;
exit( EXIT_FAILURE );
}
}
您将获得:
./cl_env.bat /I. /EHsc /Femain.exe main.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
main.cpp
main.cpp(52): warning C4804: '>': unsafe use of type 'bool' in operation
main.cpp(53): warning C4804: '>': unsafe use of type 'bool' in operation
Microsoft (R) Incremental Linker Version 14.00.23506.0
Copyright (C) Microsoft Corporation. All rights reserved.
/out:main.exe
main.obj
其中 cl_env.bat
是:
@echo off
:: Path to your Visual Studio folder.
::
:: Examples:
:: C:\Program Files\Microsoft Visual Studio 9.0
:: F:\VisualStudio2015
set VISUAL_STUDIO_FOLDER=F:\VisualStudio2015
:: Load compilation environment
call "%VISUAL_STUDIO_FOLDER%\VC\vcvarsall.bat"
:: Invoke compiler with any options passed to this batch file
"%VISUAL_STUDIO_FOLDER%\VC\bin\cl.exe" %*
有问题的行不是布尔值:
if( ( 2 > inputLevelSize > COMPUTE_DEBUGGING_DEBUG_INPUT_SIZE )
|| ( 2 > builtInLevelSize > COMPUTE_DEBUGGING_DEBUG_INPUT_SIZE ) )
如何正确的表达0 < x < 10
?
所说的是相对于解释器而言的。示例:
当 C++ 标准规定编译器必须将 0 < x < 10
理解为 ( 0 < x ) && ( x < 10 )
,但编译器实际上将其理解为 ( 0 < x ) < 10
,我们称它为编译器错误。
因此当用户声明编译器必须将0 < x < 10
理解为( 0 < x ) && ( x < 10 )
,但编译器实际上将其理解为( 0 < x ) < 10
,我们称其为用户的错误。
a > b > c
等条件并不像您认为的那样起作用。事实上,它们的工作方式类似于 (a > b) > c
(因为 >
运算符从左到右工作),但是 a > b
的结果是一个布尔值,因此是警告。
正确的方法是使用&&
(逻辑and
):
if(a > b && b > c)
范围检查表达式的正确写法是:
( 0 < x ) && ( x < 10 )
如所写,该行的计算结果为 ((0 < x) < 10)
。
如果你像 0 < x < 10
一样比较它,它首先计算 0 < x
是真还是假,然后将它与 10 进行比较。你需要像 0 < x && x < 10
这样的表达式分开。
为什么 warning C4804: '>': unsafe use of type 'bool' in operation
在 Visual Studio 2015 年流行?
如果您 运行 此代码:
#include <iostream>
#include <cstdlib>
int main( int argumentsCount, char* argumentsStringList[] )
{
#define COMPUTE_DEBUGGING_LEVEL_DEBUG 0
#define COMPUTE_DEBUGGING_DEBUG_INPUT_SIZE 32
int inputLevelSize;
int builtInLevelSize;
inputLevelSize = strlen( "a1" );
builtInLevelSize = strlen( "a1 a2" );
if( ( 2 > inputLevelSize > COMPUTE_DEBUGGING_DEBUG_INPUT_SIZE )
|| ( 2 > builtInLevelSize > COMPUTE_DEBUGGING_DEBUG_INPUT_SIZE ) )
{
std::cout << "ERROR while processing the DEBUG LEVEL: " << "a1" << std::endl;
exit( EXIT_FAILURE );
}
}
您将获得:
./cl_env.bat /I. /EHsc /Femain.exe main.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
main.cpp
main.cpp(52): warning C4804: '>': unsafe use of type 'bool' in operation
main.cpp(53): warning C4804: '>': unsafe use of type 'bool' in operation
Microsoft (R) Incremental Linker Version 14.00.23506.0
Copyright (C) Microsoft Corporation. All rights reserved.
/out:main.exe
main.obj
其中 cl_env.bat
是:
@echo off
:: Path to your Visual Studio folder.
::
:: Examples:
:: C:\Program Files\Microsoft Visual Studio 9.0
:: F:\VisualStudio2015
set VISUAL_STUDIO_FOLDER=F:\VisualStudio2015
:: Load compilation environment
call "%VISUAL_STUDIO_FOLDER%\VC\vcvarsall.bat"
:: Invoke compiler with any options passed to this batch file
"%VISUAL_STUDIO_FOLDER%\VC\bin\cl.exe" %*
有问题的行不是布尔值:
if( ( 2 > inputLevelSize > COMPUTE_DEBUGGING_DEBUG_INPUT_SIZE )
|| ( 2 > builtInLevelSize > COMPUTE_DEBUGGING_DEBUG_INPUT_SIZE ) )
如何正确的表达0 < x < 10
?
所说的是相对于解释器而言的。示例:
当 C++ 标准规定编译器必须将
0 < x < 10
理解为( 0 < x ) && ( x < 10 )
,但编译器实际上将其理解为( 0 < x ) < 10
,我们称它为编译器错误。因此当用户声明编译器必须将
0 < x < 10
理解为( 0 < x ) && ( x < 10 )
,但编译器实际上将其理解为( 0 < x ) < 10
,我们称其为用户的错误。
a > b > c
等条件并不像您认为的那样起作用。事实上,它们的工作方式类似于 (a > b) > c
(因为 >
运算符从左到右工作),但是 a > b
的结果是一个布尔值,因此是警告。
正确的方法是使用&&
(逻辑and
):
if(a > b && b > c)
范围检查表达式的正确写法是:
( 0 < x ) && ( x < 10 )
如所写,该行的计算结果为 ((0 < x) < 10)
。
如果你像 0 < x < 10
一样比较它,它首先计算 0 < x
是真还是假,然后将它与 10 进行比较。你需要像 0 < x && x < 10
这样的表达式分开。