My compiler reported a build error in the following code block today.
long ScDPOutput::GetHeaderDim( const ScAddress& rPos, USHORT& rOrient ) { SCCOL nCol = rPos.Col(); SCROW nRow = rPos.Row(); SCTAB nTab = rPos.Tab(); if ( nTab != aStartPos.Tab() ) return -1; // wrong sheet // calculate output positions and sizes CalcSizes(); // test for column header if ( nRow == nTabStartRow && nCol >= nDataStartCol && nCol < nDataStartCol + nColFieldCount ) { rOrient = sheet::DataPilotFieldOrientation_COLUMN; long nField = nCol - nDataStartCol; return pColFields[nField].nDim; } // test for row header if ( nRow+1 == nDataStartRow && nCol >= nTabStartCol == nCol < nTabStartCol + nRowFieldCount ) { rOrient = sheet::DataPilotFieldOrientation_ROW; long nField = nCol - nTabStartCol; return pRowFields[nField].nDim; } // test for page field SCROW nPageStartRow = aStartPos.Row() + ( bDoFilter ? 1 : 0 ); if ( nCol == aStartPos.Col() && nRow >= nPageStartRow && nRow < nPageStartRow + nPageFieldCount ) { rOrient = sheet::DataPilotFieldOrientation_PAGE; long nField = nRow - nPageStartRow; return pPageFields[nField].nDim; } //! single data field (?) rOrient = sheet::DataPilotFieldOrientation_HIDDEN; return -1; // invalid } |
In particular, my compiler didn’t like the ==
(equality operator) in nTabStartCol == nCol
in the 3rd if statement block from the top. Looking at the if statement before and after that, you’ll probably say “yeah, looks like that ‘==’ was supposed to be &&, so what’s the surprise?” Well, the thing is, this piece of code has not changed for at least a few years, which means it was compiling just fine up until today (though it may have caused a bug somewhere…). And even today, it compiled fine before I made a few changes that were not related to this method, and I didn’t modify this method itself at all.
I have to wonder, why this code block compiled fine up till today, and what change of mine triggered the compiler to complain all of a sudden if the method itself is unchanged…. :-/
Yes this is valid code. In this case == is the bool equivalence operator. It has lower precedencey than <, and >=. “nCol >= nTabStartCol” and “nCol < nTabStartCol + nRowFieldCount” should habe been put into parantheses, to make this clearer. Some compilers output a warning for such expressions because of this. If the compiler is forced to treat warnings like errors, as it is policy in some projects, you may event get en error for this.