web-dev-qa-db-ja.com

なぜgccは、この行が「ガードされているかのように誤解を招くようにインデントされている」と警告しているのですか?

警告は次のとおりです。

/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,000の評判を持っているので、以下に追加しました。)

#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)
}
5
Dronz

当然、この質問のすべてをここに入力した後、条件付きの49行目をインデントするためにスペースが使用されていることを発見しましたが、a tab =行51をインデントするために使用されました。

他の誰かがこれに混乱した場合に備えて、私は自分の質問を削除するのではなく答える方がよいと思います。

コンパイラーがスペースとタブを比較する方法がないのは理にかなっているので、バグではありません。空白のインデントと一貫していることは、別の理由です(たとえば、ソースコードでタブを使用しないようにすることで)。

13
Dronz