[cfe-dev] CLang compiling windows.h from the Windows SDK

Jesse Towner townerj at gmail.com
Sun Aug 8 07:26:57 PDT 2010


I think Per was also defining WIN32_LEAN_AND_MEAN in addition to setting
up _MSC_VER before including Windows.h to reduce what was included. You
can also try defining VC_EXTRALEAN to further reduce dependencies.

Example:

// test.c
#define WIN32_LEAN_AND_MEAN
#define VC_EXTRALEAN
#include <Windows.h>

- Jesse

On Sun, 2010-08-08 at 09:34 -0400, Francois Pichet wrote:
> Hi,
> 
> Read this if you are interested in CLang compatibility with MSVC.
> 
> Today I did some testing compiling just <windows.h> in C and C++ mode
> using CLang.  (Let's forget MFC)
> Note that including <windows.h> pulls close to 80000 lines of C/C++ declaration.
> I used the <Windows.h> bundled with Visual Studio 2008 (SDK v7.0A).
> BTW the <Windows.h> coming with the MinGW package is compiling fine
> but that's to be expected I think.
> 
> I created a file "test.c" containing just 1 line:
> #include "Windows.h"
> 
> Then I compiled in C mode and C++ mode using
> clang -I"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include"
> -D_MSC_VER=1500 -Wno-missing-declarations -Wno-invalid-token-paste
> -Wno-unused-value -x c test.c
> and
> clang -I"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include"
> -D_MSC_VER=1500 -Wno-missing-declarations -Wno-invalid-token-paste
> -Wno-unused-value -x c++ test.c
> 
> _MSC_VER=1500 emulate MSVC 2008.
> 
> 
> In C mode there are only 2 kinds of error:
> 1- MSVC allows typedef redefinition with a different type, CLang doesn't.
> 2- CLang flags this as a error:
>             typedef struct tagPROPVARIANT PROPVARIANT;
>             void foo(PROPVARIANT a[]);         <====== array has
> incomplete element type 'PROPVARIANT'
> (both cl.exe and gcc.exe accepts foo prototype, note that
> tagPROPVARIANT is actually undefined at this point)
> 
> 
> In C++ mode there are only 3 kinds of error:
> 1- MSVC allows typedef redefinition with a different type, CLang
> doesn't. (same thing as in C mode)
> 2- CLang doesn't recognize the __uuidof operator.
> 3. CLang doesn't like:
>      template<typename T> void** IID_PPV_ARGS_Helper(T** pp)
>      {
>         static_cast<IUnknown*>(*pp);            <=== clang error:
> unknown type name 'IUnknown'
>         return reinterpret_cast<void**>(pp);
>      }
> Note that 'IUnknown' is actually undefined at this point but MSVC accept it.
> 
> 
> CLang is actually very close to be able to handle the core Windows
> system headers as provided by Microsoft.
> Should I report these as bugs?
> Is CLang being able to parse the Windows SDKs core headers a worthwhile goal?
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev





More information about the cfe-dev mailing list