On 2015-12-31 17:50, Agustín K-ballo Bergé wrote:
On 12/31/2015 11:32 AM, 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.
I made a little experiment to try to understand what you are saying:
http://melpon.org/wandbox/permlink/ncVqjnyzuTlepx2F
As you can see, this reproduces both the gcc warning and a clang error, but only for the conflicting declaration of `bar`. The difference in namespace for `foo` is irrelevant, as the standard says.
Ok, but it doesn't really matter. Boost.WinAPI does re-define some of the Windows SDK structs, so it has to duplicate affected functions as well. The declarations in the global namespace are mirroring the real declarations in Windows SDK; these names are considered reserved anyway because including Windows SDK headers may result in these names being used. boost::detail::winapi::* symbols are considered the interface for Boost libraries.