Comment faire pour que c++0x et ANSI STRICT s'entendent bien?

j'ai besoin d'utiliser popen dans un projet, mais j'obtiens:

error: 'popen' was not declared in this scope

on dirait que GCC définit __STRICT_ANSI__-std=c++0x et (contrairement à ce que peu d'informations que j'ai pu trouver) -std=gnu++0x, ce qui provoque popen (et _popen) pour être ramené à partir de stdio. Assez curieusement, invaincu!--2--> ne résout pas le problème, pas plus que de déclarer la fonction. Je suis évidemment manque quelque chose. Est-il raisonnable de solution de contournement?

J'utilisais MinGW avec 4.5.0, et mis à niveau à 4.5.2, mais je suis toujours aux prises avec le même problème. Je préférerais ne pas avoir à me balader avec msys pour compiler 4.6.0, mais je le ferai si je le dois.

23
demandé sur Jon Purdy 2011-04-07 16:20:22

3 réponses

je suis simplement en train de le désactiver sur la ligne de commande tout de suite, ce n'est pas terriblement "propre" mais ça fonctionne très bien de ce que je peux dire.

-std=gnu++0x -U__STRICT_ANSI__

il y a probablement une bonne raison pour laquelle on ne devrait pas faire ça, mais ça me donne ce que je veux (c++0x plus extensions GNU, plus legacy stuff fonctionne toujours). J'ai fait cela pendant une longue période et ne jamais en difficulté. Mais ne me blâmez pas si ça mange votre chat.

28
répondu Damon 2011-04-07 12:23:40

J'ai testé MinGW gcc 4.6.1 et gcc 4.7.0: ils définissent tous deux __STRICT_ANSI__-std=c++0x, mais ne le définissez pas pour -std=gnu++0x.

8
répondu kkoehne 2012-09-06 07:49:21

La réponse courte à la question

Comment faire pour que C++0x et __STRICT_ANSI__ s'entendent bien?

devrait être: utiliser -std=gnu++0x au lieu de -std=c++0x. Cela devrait définir __STRICT_ANSI__ [1], il y a probablement quelque chose d'autre à vous Makefile ou construire un environnement qui permet encore de le définir [2].

un travail (moins preferé) - à ce moment-là, comme l'ont souligné d'autres, serait de onu-définir avec un commutateur de ligne de commande -U__STRICT_ANSI__.

notez que pour spécifier la norme C pour laquelle votre code est écrit,-std=gnu++* serait le commutateur typique à utiliser, plutôt que -std=c++*, aussi longtemps que vous voulez les extensions GNU (en gcc, les extensions GNU sont activées par défaut, mais seront désactivées si vous spécifiez -std=c++*).

Autre remarque; pour C, ce qui est similaire:

$ touch empty.c
$ gcc -std=c99 -E -dM empty.c | grep '\(__STRICT\|__STDC_V\)'
#define __STRICT_ANSI__ 1
#define __STDC_VERSION__ 199901L
$ gcc -std=gnu99 -E -dM empty.c | grep '\(__STRICT\|__STDC_V\)'
#define __STDC_VERSION__ 199901L

vous obtiendrez la prise en charge de la langue pour la version C désirée, avec ou sans __STRICT_ANSI__ défini (il y a peut-être d'autres différences).


[1]:

https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html:

__STRICT _ ANSI__

GCC définit cette macro si et seulement si le commutateur-ansi, ou le commutateur a-std spécifiant une stricte conformité à une version D'ISO C ou ISO c++, a été spécifié lorsque GCC a été invoquer. Il est défini à ‘1’. Cette macro existe principalement pour diriger les fichiers d'en-tête de GNU libc afin de restreindre leurs définitions à l'ensemble minimal trouvé dans le standard C de 1989.

que c'est le cas peut facilement être confirmé (run on gcc 4.8.2):

$ touch empty.cpp
$ gcc -std=c++0x -E -dM empty.cpp | grep '__STRICT'
#define __STRICT_ANSI__ 1
$ gcc -std=gnu++0x -E -dM empty.cpp | grep '__STRICT'
$ # (no match)

[2]: quelque chose ajoutant un -ansi changer peut-être? Cela vous donnera de l' __STRICT_ANSI__, même en spécifiant -std=gnu++*, comme l'indique la documentation (voir la citation ci-dessus), et facilement être vérifiés:

$ gcc -std=gnu++0x -E -dM -ansi empty.cpp | grep '__STRICT'
#define __STRICT_ANSI__ 1
1
répondu Carl 2015-04-01 21:04:57