HomeBlogMagic

Warning beheben: C4244 bei transform(..., ::toupper)

Wer in Visual Studio 2017 die c++ std lib benutzt und mit Warning Level 4 arbeitet kann teilweise böse Überraschungen erleben.

Eine davon ist folgende Warnung

c:\program files (x86)\microsoft visual studio\2017\enterprise\vc\tools\msvc\14.14.26428\include\algorithm(1404): warning C4244: '=': conversion from 'int' to 'char', possible loss of data

Bei mir trat es in einer transform Funktion auf:

std::string& doToUpper(std::string& sToMakeUpper)
{
  std::transform(sToMakeUpper.begin(), sToMakeUpper.end(), sToMakeUpper.begin(), ::toupper);
  return sToMakeUpper;
}

Zum Beheben des Fehlers muss der Rückgabewert von der Funktion toupper in einer eigenen Funktion gecastet werden:

inline char w4_toupper(int c) { return static_cast<char>(::toupper(c)); }

std::string& doToUpper(std::string& sToMakeUpper)
{
  std::transform(sToMakeUpper.begin(), sToMakeUpper.end(), sToMakeUpper.begin(), w4_toupper);
  return sToMakeUpper;
}

Danach kompiliert die funktion ohne Warning.