<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p>Can't you just "#define WIN32 WIN32"?<br>
    </p>
    <div class="moz-cite-prefix">Am 06.01.2021 um 11:05 schrieb
      Francesco Pretto:<br>
    </div>
    <blockquote type="cite"
cite="mid:CALas-iifwgBC8cLhP0HAnC6arAGWwCnsvjR3myXYZBGnT0AZ3Q@mail.gmail.com">
      <meta http-equiv="content-type" content="text/html; charset=UTF-8">
      <div dir="ltr">Hello,
        <div><br>
        </div>
        <div>I'm experiencing a clash between the very commonly defined
          macro WIN32 and the Surface::Type::WIN32 enum identifier.
          Basically WIN32 is default defined in all Visual Studio IDE
          projects (.vcxproj projects), and there's not much to do about
          it: a regular Visual Studio project trying to use cairomm will
          fail building because of expansion of the Surface::Type::WIN32
          identifier to 1. I elaborate a bit more about default defined
          macros in Windows/Visual Studio world:</div>
        <div>1) MSVC **compiler** (not msbuild project build
          configuration) intrinsically defines _WIN32. This is
          officially documented in this page [1];</div>
        <div>2) Historically all Visual Studio versions also default
          defines WIN32 macro for IDE built projects. I can't find
          official statements about it but there are many mentions about
          this[2] and it can be easily tested by creating a command line
          project and specifically checking against the WIN32 define.
          Also very relevant: CMake generated projects also define
          WIN32, and you can test it easily or read the words of the
          project maintainer Brad King[3]. Much software will break if
          WIN32 is not defined, in my experience much more than 50% of
          software either using WIN32 or _WIN32.</div>
        <div><br>
        </div>
        <div>Because of the reasons in 2) the choice for cairomm of
          naming an identifier WIN32 was unlucky and unfortunate, and if
          you want to the library to be usable in commonly run Visual
          Studio environments there's not much choice other than
          breaking the API and rename the Surface::Type::WIN32
          identifier to something else. My suggestion is renaming:</div>
        <div>- 
          Surface::Type::WIN32 -> 
          Surface::Type::WIN32GDI;</div>
        <div>- For sake of consistency also WIN32_PRINTING could be
          renamed to WIN32GDI_PRINTING, but this is optional.</div>
        <div><br>
        </div>
        <div>I guess the amount of users that would break with this
          change is very low. Also it would be a non breaking ABI
          change. I'm not the right person to talk about this, though.</div>
        <div><br>
        </div>
        <div>Attached the patch that does rename. It can also be used as
          a temporary fix for users that want to use cairomm in a VS
          built project.</div>
        <div><br>
        </div>
        <div>Regards,</div>
        <div>Francesco</div>
        <div><br>
        </div>
        <div>[1] <a
href="https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=msvc-160"
            moz-do-not-send="true">https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=msvc-160</a></div>
        <div>[2] <a href="https://stackoverflow.com/a/662543/213871"
            moz-do-not-send="true">https://stackoverflow.com/a/662543/213871</a></div>
        <div>[3] <a
            href="https://cmake.org/Bug/view.php?id=14827#c35569"
            moz-do-not-send="true">https://cmake.org/Bug/view.php?id=14827#c35569</a></div>
      </div>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
    </blockquote>
  </body>
</html>