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

Douglas Gregor dgregor at apple.com
Sun Aug 8 12:52:54 PDT 2010



Sent from my iPhone

On Aug 8, 2010, at 10:26 AM, Jesse Towner <townerj at gmail.com> wrote:

> 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.

That's not a realistic use case, though. Some apps define these macros, many don't. If we're trying to get better Windows compatibility, we need to handle all of windows.h. 




> 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
> 
> 
> _______________________________________________
> 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