Boost logo

Boost :

Subject: Re: [boost] [winapi] [thread] Conflicting declarations on MinGW
From: Andrey Semashev (andrey.semashev_at_[hidden])
Date: 2015-12-31 09:44:33


On 2015-12-31 17:32, Andrey Semashev wrote:
> On 2015-12-31 15:47, Agustín K-ballo Bergé wrote:
>> On 12/31/2015 7:59 AM, Andrey Semashev wrote:
>>> On 2015-12-31 13:40, Antony Polukhin wrote:
>>>> Hi,
>>>>
>>>> Some of the Boost.DLL tests produce following warnings:
>>>>
>>>> ../boost/thread/win32/thread_primitives.hpp:175:83: warning:
>>>> declaration of
>>>> 'void* boost::detail::win32::GetModuleHandleA(const char*)' with C
>>>> language
>>>> linkage
>>>> ../boost/detail/winapi/dll.hpp:47:1: warning: conflicts with previous
>>>> declaration 'HINSTANCE__*
>>>> GetModuleHandleA(boost::detail::winapi::LPCSTR_)'
>>>> ../boost/thread/win32/thread_primitives.hpp:195:94: warning:
>>>> declaration of
>>>> 'int (__attribute__((__stdcall__)) *
>>>> boost::detail::win32::GetProcAddress(void*, const char*))()' with C
>>>> language linkage
>>>> ../boost/detail/winapi/dll.hpp:82:1: warning: conflicts with previous
>>>> declaration 'int (__attribute__((__stdcall__)) *
>>>> GetProcAddress(boost::detail::winapi::HMODULE_,
>>>> boost::detail::winapi::LPCSTR_))()'
>>>>
>>>>
>>>> Andrey, Vicente what's the best way to resolve such issues?
>>>
>>> IMO, Boost.Thread needs to be ported to Boost.WinAPI.
>>> boost/thread/win32/thread_primitives.hpp declares extern "C" functions
>>> in its own namespace, while Windows SDK and Boost.WinAPI declare them in
>>> the global namespace.
>>
>> Declaring extern "C" functions in a namespace is perfectly fine.
>> Frankly, I'm surprised and disappointed that Boost.WinAPI does not do
>> it, and that it will litter the global namespace instead.
>
> It did, until it caused problems with clang - similar to the ones quoted
> by Antony above.
>
>> The warning comes from the use of different arguments and/or return type
>> in the declarations. I'm guessing Boost.WinAPI is using winapi's typed
>> handles, while we can see in the warning message that Boost.Thread uses
>> just `void`.
>
> The types in Boost.WinAPI are the same as the ones in Windows SDK (sans
> the typedefs, which I assume are not essential). There are no structs in
> the mentioned functions, and as far as I can see the types in
> Boost.Thread are also the same. So the only difference seems to be the
> namespace in which the functions are declared.

Oh, you meant HINSTANCE/HMODULE? Yes, you're right, this type may be
diffrent, depending on whether STRICT is defined or not.

In any case, I still think that porting Boost.Thread to Boost.WinAPI is
the right solution. WinAPI is a mess, so let's keep this mess in one place.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk