Почему gcc предупреждает меня, что эта строка "вводит в заблуждение, как если бы она была защищена" if if? - PullRequest
0 голосов
/ 13 мая 2018

Предупреждение:

/home/dronz/OF/apps/myApps/HexMap/src/HexMap.cpp:48:5: warning: this ‘if’ clause 
does not guard... [-Wmisleading-indentation]
     if (toHexSize < 1)
     ^~
/home/dronz/OF/apps/myApps/HexMap/src/HexMap.cpp:51:2: note: ...this statement, 
but the latter is misleadingly indented as if it were guarded by the ‘if’
  MapTileSizeAtZoom = toHexSize;
  ^~~~~~~~~~~~~~~~~

И код такой:

if (toHexSize < 1)
    toHexSize = 1;

MapTileSizeAtZoom = toHexSize;

Я мог бы ввести в заблуждение, если бы строка MapTileSizeAtZoom ... была с большим отступом, но на том же уровне отступа, что и 'if', так что мне это кажется правильным.

Я подумал, что, может быть, есть дополнительные пробелы и / или табуляции, но я обрезал все лишние пробельные символы после текста, и это не имело никакого значения.

Я подумал, что, может быть, это смущает пустая строка, но удаление не остановило предупреждение.

Кроме того, перед этим в том же файле .cpp находится этот код, о котором он не предупреждает:

if (toHexSize < 1)
    toHexSize = 1;

HexInfo centerOnHex;
if (SelectedHex.type != -1)

Так что мне интересно почему он предупреждает об одном (вообще), и почему он не предупреждает о другом, является ли это ошибкой gcc, и что делать, чтобы ее избежать?

. , .

Редактировать: @NeilButterworth попросил меня опубликовать "весь код". (Не показалось актуальным, но у него 25 тысяч репутации, поэтому я добавил ее ниже.)

#include "HexMap.h"
#include <algorithm>
#include <cmath>

//--------------------------------------------------------------
HexMap::HexMap()
{}

//--------------------------------------------------------------
int HexMap::SetZoom(int toHexSize)
{
    if (toHexSize < 1)
        toHexSize = 1;

    HexInfo centerOnHex;
    if (SelectedHex.type != -1)
    {
        // Center map on the selected hex.
        centerOnHex = SelectedHex;
    }
    else
    {
        // Center map on current center of viewpoint.
        centerOnHex = GetHex(
            MapFrame.x + MapFrame.getWidth() / 2,
            MapFrame.y + MapFrame.getHeight() / 2 );
        if ((centerOnHex.x > WORLDMAPWIDTH) || (centerOnHex.x < 0))
            centerOnHex.x = WORLDMAPWIDTH / 2;
        if ((centerOnHex.y > WORLDMAPHEIGHT) || (centerOnHex.y < 0))
            centerOnHex.y = WORLDMAPHEIGHT / 2;
    }

    setHexDisplaySize(toHexSize);

    // Center map:
    HexOriginX = MapFrame.x + MapTileWidth  * 0.25f;
    HexOriginY = MapFrame.y + MapTileHeight * 0.5f;
    ViewPosOnWorld.set(
        centerOnHex.x - (MapFrame.getWidth() / 2) / MapTileWidth, 
        centerOnHex.y - (MapFrame.getHeight() / 2) / MapTileHeight);

    return 0;
}

//--------------------------------------------------------------
void HexMap::setHexDisplaySize(int toHexSize)
{
    if (toHexSize < 1)
        toHexSize = 1;

    MapTileSizeAtZoom = toHexSize;
    MapTileWidth = MapTileSizeAtZoom * 1.5f; // hex x-spacing is 1.5 * r
    MapTileHeight = MapTileSizeAtZoom * 1.73205f; // hex height = sqrt(3*r)

    // Size images & hexmask:
    MaskWidth = MapTileHeight * 1.154700538;  // 1/(sqrt(3)/2)
}

1 Ответ

0 голосов
/ 13 мая 2018

Естественно, набрав здесь весь этот вопрос, я обнаружил, что были отступы для условной строки 49, но табуляция использовалась для отступа строки 51.

Так что я полагаю, что я могу также ответить на свой вопрос, а не удалять его, на случай, если кто-то еще запутается в этом.это не ошибкаЭто еще одна причина для соответствия отступам в пробелах (например, избегая использования любых вкладок в исходном коде).

...