From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 39215 invoked by alias); 5 Sep 2018 20:41:28 -0000 Mailing-List: contact cygwin-help@cygwin.com; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner@cygwin.com Mail-Followup-To: cygwin@cygwin.com Received: (qmail 39204 invoked by uid 89); 5 Sep 2018 20:41:28 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-1.7 required=5.0 tests=AWL,BAYES_00,KAM_LAZY_DOMAIN_SECURITY,RCVD_IN_DNSWL_LOW autolearn=no version=3.3.2 spammy=Requirements, H*R:D*ca, advised X-HELO: smtp-out-so.shaw.ca Received: from smtp-out-so.shaw.ca (HELO smtp-out-so.shaw.ca) (64.59.136.137) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 05 Sep 2018 20:41:26 +0000 Received: from [192.168.1.100] ([24.64.240.204]) by shaw.ca with ESMTP id xec7fuVol5Hxqxec8fIDeK; Wed, 05 Sep 2018 14:41:24 -0600 Reply-To: Brian.Inglis@SystematicSw.ab.ca Subject: Re: Why does -std=c++11 hide certain function calls To: cygwin@cygwin.com References: <55fcf4b3-5fd0-8fa1-6669-5a93a14c863e@t-online.de> From: Brian Inglis Openpgp: preference=signencrypt Message-ID: <258a1db5-4151-33c7-5db6-2a06f82975c5@SystematicSw.ab.ca> Date: Wed, 05 Sep 2018 20:41:00 -0000 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-IsSubscribed: yes X-SW-Source: 2018-09/txt/msg00105.txt.bz2 On 2018-09-05 13:36, John Selbie wrote: > On Wed, Sep 5, 2018 at 11:46 AM Hans-Bernhard Bröker wrote: >> Am 05.09.2018 um 07:55 schrieb John Selbie: >>> With this: g++ foo.cpp -c -std=c++11 >>> It compiles fine everywhere else, except CygWin. Output on Cygwin: >> I'm afraid that may mean everywhere else is wrong. >>> Yes, switching to -std=gnu++11 or adding -D_DEFAULT_SOURCE to the >>> command line works. >>> But I don't understand why the need to enforce these extensions to get >>> access to some of the most common unix libraries? >> Because that's what std=c++11 is meant and documented to do. It turns >> off all extensions to the standard language. And yes, that does include >> extensions to the standard libary, up to and including POSIX-specific >> content. >> For what you want to do, std=c++11 is simply the wrong setting. > But why is getaddrinfo (and its associated struct types and flag values) > considered a "language extension" and hidden via the __POSIX_VISIBILE > define when other function declarations in netdb.h (such as getservbyname) > are not? > I don't believe C++ has any formal support for networking. So it's > surprising to see one networking function hidden "because its an > extension", but the other very related functions are not. Can you elaborate > on the decision process that makes it this way? I honestly don't see how a > header file qualifies as a language extension, but instead just see it as > the interface for a pre-compiled library. > Is it because modern C++ is defined to support older POSIX functions, but > not newer ones? Where is that in the standard? > As I said before, I'm wanting to be educated on this, because it could > influence how I view the writing and building of portable code now and in > the future. But saying, "everywhere else but here is wrong" and because ", > doesn't help. Depends on how standards compliant the implementation and the developer are. Some(/all?) BSDs specify nothing, but POSIX and other standards specify feature test macros to enable access to those functions be defined for every C source module that requires them before any includes e.g. for Linux/GLIBC getaddrinfo(3): "Feature Test Macro Requirements for glibc (see feature_test_macros(7)): getaddrinfo(), freeaddrinfo(), gai_strerror(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE" so to be guaranteed access to those functions, you should define and set one of those symbols, in each source file, build command line, or makefile, which -std=gnu* (or no -std flag) does for you. For Unixy builds, just don't specify -std. Only specify -std if you want to ensure that builds will work with earlier standards, compilers, or libraries, or for -std=c* without any special language or library features, in which case you may also want to add -pedantic or more restrictive options. -- Take care. Thanks, Brian Inglis, Calgary, Alberta, Canada This email may be disturbing to some readers as it contains too much technical detail. Reader discretion is advised. -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple