OVH Cloud OVH Cloud

Pas de M_PI ??

24 réponses
Avatar
Florent 'flure' C.
Bonjour,

je crains fort d'être hors charte, mais bon tant pis pour moi, je pose
quand même ma question.

dans math.h, j'ai ceci :

#if defined __USE_BSD || defined __USE_XOPEN
...
# define M_PI 3.14159265358979323846 /* pi */
...
#endif

puis plus loin :
#ifdef __USE_GNU
...
# define M_PIl 3.1415926535897932384626433832795029L /* pi */
...
#endif

Et dans mon programme, j'ai besoin d'une constante PI, même sans grande
précision (donc M_PI suffirait, mais 3.14 serait un peu juste). Hors, que
j'utilise M_PI ou M_PIl, le compilateur me dit :

pqtorus.c:40: error:`M_PIl' undeclared (first use in this function)

J'ai bien sur #includé math.h.

Dois-je définir l'une ou l'autre des constantes __USE_BSD, __USE_XOPEN,
__USE_GNU ? Ça ne me paraîtrait pas très propre ... Ou bien s'agit-il
d'une option de compilation qui me manque ?
Pour info j'utilise -Wall -std=c99 avec gcc3.3.4 (sous Debian si ça peut
avoir une quelconque importance).

Merci d'avance pour toute aide qui me serait précieuse.

--
Florent "flure" C.
Décrypter l'@ pour répondre
Coders don't die, they just JMP without RET !

4 réponses

1 2 3
Avatar
cedric
Florent 'flure' C. wrote:
#ifndef M_PI
const double M_PI = 3.14159265358979323846;
#endif


A mon avis, #define M_PI 3.14etc aurait été plus intuitif et plus
inspiré. En effet tu (ou un autre) pourrait en utilisant cette
définition écrire un &M_PI quelque part sans remarquer l'erreur ; et ce
n'est qu'un exemple.

Par ailleurs, plutot que le ifndef, moi j'aurais fait carrément :

#undef M_PI
#define M_PI etc...

Avatar
Florent 'flure' C.
Le Sat, 18 Sep 2004 23:42:22 +0200, cedric a écrit :

Florent 'flure' C. wrote:
#ifndef M_PI
const double M_PI = 3.14159265358979323846; #endif


A mon avis, #define M_PI 3.14etc aurait été plus intuitif et plus
inspiré. En effet tu (ou un autre) pourrait en utilisant cette
définition écrire un &M_PI quelque part sans remarquer l'erreur ; et ce
n'est qu'un exemple.


Tout à fait, je m'en suis rapidement rendu compte : le compilo essayait
d'instancier plusieurs fois const double M_PI ...

Par ailleurs, plutot que le ifndef, moi j'aurais fait carrément :

#undef M_PI
#define M_PI etc...


ah par contre :

#ifndef M_PI
#define M_PI ..
#endif

a l'air de très bien fonctionner ...

--
Florent "flure" C.
Décrypter l'@ pour répondre
Coders don't die, they just JMP without RET !


Avatar
Antoine Leca
En , Jean-Marc Bourguet va escriure:
En fait j'a choisi cette méthode finalement :

#ifndef M_PI
const double M_PI = 3.14159265358979323846;
#endif

dans un .h inclus presque partout.

J'espère qu'il n'y a pas de contre-indications à cela ?


Définir un symbole dont il est connu (et même attendu) qu'il
est communément utilisé comme macro à autre chose qu'une
macro me semble de très mauvais style.


C'est pas beau, mais dans ce sens-là ce n'est pas vraiment un problème:

Si tu définis avant M_PI, la constante est court-circuitée: pas vraiment un
souci.
Si tu définis M_PI après, tu auras la macro, dont on suppose que la valeur
est similaire.
Si tu rajoute un #undef après, rien ne se passe.

Le seul souci, c'est s'il utilise M_PI avec &: cela marchera silencieusement
en mode ISO, mais ne marchera plus en mode BSD ou GNU.


Autre chose un peu surprenante, c'est que si le .h est inclus plusieurs fois
(problème quelconque avec la protection contre les inclusions multiples), on
va obtenir une erreur de double définition.


Pour faire bon poids, j'aurais ajouté dans le #ifndef

#define M_PI M_PI

Mais c'est un potentiel générateur de problèmes (augmenter la complexité de
manière non nécessaire n'est jamais une bonne chose; de plus on peut
toujours tomber sur un préprocesseur antédiluvien qui va entrer en boucle
sans fin).


Antoine


Avatar
James Kanze
Jean-Marc Bourguet writes:

|> "Florent 'flure' C." writes:

|> > En fait j'a choisi cette méthode finalement :

|> > #ifndef M_PI
|> > const double M_PI = 3.14159265358979323846;
|> > #endif

|> > dans un .h inclus presque partout.

|> > J'espère qu'il n'y a pas de contre-indications à cela ?

|> Définir un symbole dont il est connu (et même attendu) qu'il est
|> communément utilisé comme macro à autre chose qu'une macro me semble
|> de très mauvais style.

C'est pire, si c'est du C. Parce qu'en C, un const n'est pas static par
défaut. Il risque donc d'avoir des définitions multiples lors de
l'édition des liens.

--
James Kanze
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
1 2 3