为什么`警告C4804:'>':不安全地使用类型' bool'在操作`中弹出Visual Studio 2015?

时间:2017-03-02 10:30:06

标签: c++ visual-studio-2015 cl

为什么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" %*

有问题的行不是bool:

    if( ( 2 > inputLevelSize > COMPUTE_DEBUGGING_DEBUG_INPUT_SIZE )
        || ( 2 > builtInLevelSize > COMPUTE_DEBUGGING_DEBUG_INPUT_SIZE ) )

如何正确地将表达式设为0 < x < 10

所说的与口译员有关。例子:

  1. 当C ++标准规定编译器必须将0 < x < 10理解为( 0 < x ) && ( x < 10 ),但编译器实际上将其理解为( 0 < x ) < 10时,我们将其称为编译器错误。

  2. 因此,当用户声明编译器必须将0 < x < 10理解为( 0 < x ) && ( x < 10 ),但编译器实际上将其理解为( 0 < x ) < 10时,我们将其称为用户&#39}错误。

3 个答案:

答案 0 :(得分:5)

a > b > c这样的条件不会像您认为的那样发挥作用。实际上它们的工作方式类似(a > b) > c(因为>运算符从左到右工作),但a > b的结果是布尔值,因此是警告。

正确的方法是使用&&(逻辑and):

if(a > b && b > c)

答案 1 :(得分:3)

如果您将其与0 < x < 10进行比较,则首先评估0 < x是真还是假,然后将其与10进行比较。您需要将0 < x && x < 10之类的表达式分开。

答案 2 :(得分:2)

编写范围检查表达式的正确方法是:

( 0 < x ) && ( x < 10 )

写完后,该行评估为((0 < x) < 10)