OVH Cloud OVH Cloud

redeclaration de type c++

28 réponses
Avatar
pascal
Bonjour,

voila un p'tit probl=C3=A8me...

j'ai un un ent=C3=AAte de fichier avec :

#ifndef _WCHAR_H_
typedef unsigned short wchar_t
#define _WCHAR_H_

et le compilateur (GCC pour ne pas le citer) me sort le message d'erreur =
:
redeclaration of C++ built-in type 'wchar_t'

typedef n'est pas comme son nom l'indique,une d=C3=A9finition et non une =

d=C3=A9claration?

10 réponses

1 2 3
Avatar
Loïc Joly
Loïc Joly writes:

| > Bonjour,
| > voila un p'tit problème...
| > j'ai un un entête de fichier avec :
| > #ifndef _WCHAR_H_
| > typedef unsigned short wchar_t
| > #define _WCHAR_H_
| > et le compilateur (GCC pour ne pas le citer) me sort le message
| > d'erreur :
| > redeclaration of C++ built-in type 'wchar_t'
| > typedef n'est pas comme son nom l'indique,une définition et non une
| > déclaration?
|
| Je pense que ce code a pour but de contourner une limitation de vieux
| compilateurs qui ne définieraient pas le type standard wchar_t. En

et tu crois qu'un tel compilateur pourrait faure quelque chose d'un
code C++ écrit ces dix-quinze dernières année ?


Au vu de l'extrait de code affiché, qu'est-ce qui te fait croire qu'il
date des 10-15 dernières années ?

De plus, même des compilateurs relativement récents peuvent avoir ce
problème. La preuve : Boost, qui n'est pas si vieux, a du définir
BOOST_NO_INTRINSIC_WCHAR_T pour gérer cette situation.

--
Loïc

Avatar
kanze
Gabriel Dos Reis wrote:
Loïc Joly writes:


| > voila un p'tit problème...
| > j'ai un un entête de fichier avec :
| > #ifndef _WCHAR_H_
| > typedef unsigned short wchar_t
| > #define _WCHAR_H_
| > et le compilateur (GCC pour ne pas le citer) me sort le
| > message d'erreur :
| > redeclaration of C++ built-in type 'wchar_t'
| > typedef n'est pas comme son nom l'indique,une définition et non
une

| > déclaration?

| Je pense que ce code a pour but de contourner une limitation
| de vieux compilateurs qui ne définieraient pas le type
| standard wchar_t. En

et tu crois qu'un tel compilateur pourrait faure quelque chose
d'un code C++ écrit ces dix-quinze dernières année ?


Ça dépend de comment on l'écrit. Si une des exigeances du projet
est de supporter des anciens compilateurs, on peut écrire du
code qui le fait. (S'il faut, on peut même encore écrire du
C:-).) Certains projets essaient de le faire, considère
http://www.mozilla.org/hacking/mozilla-style-guide.html.

En ce qui concerne wchar_t, j'ai un vague souvenir qu'il y avait
un compilateur il n'y a pas si longtemps qui ne le supportait
pas correctement (VC++ 5.0 ?). Mais je ne suis pas sûr ; ce
n'était pas un compilateur que j'utilisais regulièrement, et je
ne me sers pas beaucoup de wchar_t non plus.

--
James Kanze GABI Software
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

Avatar
Samuel Krempp
le Thursday 31 March 2005 15:45, écrivit :
Ce qui me pose un problème c'est que ce n'est pas une entête à moi
justement,mais une entete standard fournit avec l'IDE Devcpp,et a ce que
j'ai compris jusqu'a maintenant c'est que #ifndef/#endif servait a
eviter la redefinition ou redeclaration.
Et la cela ne fonctionne pas,alors c'est soit le préprocesseur qui merde
soit la librairie standard.


nan c'est Devcpp. Je sais pas trop comment ce bout de code est censé
marcher. J'imagine qu'il suppose que la macro _WCHAR_H_ est définie lorsque
wchar_t est déclaré (d'après la norme, c'est tjrs le cas), alors que c'est
nullement universel.

--
Sam

Avatar
pascal

le Thursday 31 March 2005 15:45, écrivit :


Ce qui me pose un problème c'est que ce n'est pas une entête à mo i
justement,mais une entete standard fournit avec l'IDE Devcpp,et a ce qu e
j'ai compris jusqu'a maintenant c'est que #ifndef/#endif servait a
eviter la redefinition ou redeclaration.
Et la cela ne fonctionne pas,alors c'est soit le préprocesseur qui me rde
soit la librairie standard.




nan c'est Devcpp. Je sais pas trop comment ce bout de code est censé
marcher. J'imagine qu'il suppose que la macro _WCHAR_H_ est définie lo rsque
wchar_t est déclaré (d'après la norme, c'est tjrs le cas), alors q ue c'est
nullement universel.



cette macro a bien un rapport avec l'inclusion du fichier wchar.h ?



Avatar
pascal

le Thursday 31 March 2005 15:45, écrivit :


Ce qui me pose un problème c'est que ce n'est pas une entête à mo i
justement,mais une entete standard fournit avec l'IDE Devcpp,et a ce qu e
j'ai compris jusqu'a maintenant c'est que #ifndef/#endif servait a
eviter la redefinition ou redeclaration.
Et la cela ne fonctionne pas,alors c'est soit le préprocesseur qui me rde
soit la librairie standard.




nan c'est Devcpp. Je sais pas trop comment ce bout de code est censé
marcher. J'imagine qu'il suppose que la macro _WCHAR_H_ est définie lo rsque
wchar_t est déclaré (d'après la norme, c'est tjrs le cas), alors q ue c'est
nullement universel.



comment je trouve ou est définie la macro _WCHAR_H_ ?

ou je trouve ou est déclaré wchar_t la première fois?


Avatar
Serge Paccalin
Le vendredi 1 avril 2005 à 12:43:05, pascal a écrit dans
fr.comp.lang.c++ :


le Thursday 31 March 2005 15:45, écrivit :


Ce qui me pose un problème c'est que ce n'est pas une entête à moi
justement,mais une entete standard fournit avec l'IDE Devcpp,et a ce que
j'ai compris jusqu'a maintenant c'est que #ifndef/#endif servait a
eviter la redefinition ou redeclaration.
Et la cela ne fonctionne pas,alors c'est soit le préprocesseur qui merde
soit la librairie standard.




nan c'est Devcpp. Je sais pas trop comment ce bout de code est censé
marcher. J'imagine qu'il suppose que la macro _WCHAR_H_ est définie lorsque
wchar_t est déclaré (d'après la norme, c'est tjrs le cas), alors que c'est
nullement universel.



comment je trouve ou est définie la macro _WCHAR_H_ ?



Manifestement, elle n'est pas définie, autrment, tu n'aurais pas de
problème.

ou je trouve ou est déclaré wchar_t la première fois?


Le message d'erreur te renseigne à ce sujet : « C++ built-in type
'wchar_t' ». C'est un type qui fait partie du C++, au même titre que
char, int, float, etc. Pas besoin de déclaration où que ce soit.

--
___________ 2005-04-01 12:55:12
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763



Avatar
Anthony Fleury
pascal wrote:

cette macro a bien un rapport avec l'inclusion du fichier wchar.h ?


Oui et non, à mon avis il faudrait prendre une version plus à jour de Dev
C++, car la mienne n'a pas l'air d'avoir ce problème :

:/mnt/XP/Dev-Cpp/include$ grep -nri "typedef unsigned short
wchar_t" *
winnt.h:72:typedef unsigned short wchar_t;
:/mnt/XP/Dev-Cpp/include$

dans winnt.h :

#ifndef _WCHAR_T_DEFINED
#define _WCHAR_T_DEFINED
#ifndef _WCHAR_T_
#define _WCHAR_T_
#undef __need_wchar_t
#ifndef __cplusplus
typedef unsigned short wchar_t;
#endif
#endif
#endif

on voit clairement que en C++, ce typedef ne sera JAMAIS effectué.

Quant au _WCHAR_H_ il a en effet rapport avec l'inclusion de wchar.h :
:/mnt/XP/Dev-Cpp/include$ grep -nri _WCHAR_H_ *
wchar.h:14:#ifndef _WCHAR_H_
wchar.h:15:#define _WCHAR_H_
wchar.h:344:#endif /* not _WCHAR_H_ */
:/mnt/XP/Dev-Cpp/include$

Il évite les multiples inclusions de cet en-tête.

Quelle version de Dev-c++ ?
Et quelle en-tête contient ce problème avec le typedef entre les ifndef
endif de _WCHAR_H_ ?
Je pencherais pour un petit problème dans cette version avec un conflit de
nom entre deux en-tête.

--
Anthony Fleury

Avatar
pascal

writes:

| Gabriel Dos Reis wrote:
| > Loïc Joly writes:
|
|
| > | > voila un p'tit problème...
| > | > j'ai un un entête de fichier avec :
| > | > #ifndef _WCHAR_H_
| > | > typedef unsigned short wchar_t
| > | > #define _WCHAR_H_
| > | > et le compilateur (GCC pour ne pas le citer) me sort le
| > | > message d'erreur :
| > | > redeclaration of C++ built-in type 'wchar_t'
| > | > typedef n'est pas comme son nom l'indique,une définition et no n
| une
| > | > déclaration?
|
| > | Je pense que ce code a pour but de contourner une limitation
| > | de vieux compilateurs qui ne définieraient pas le type
| > | standard wchar_t. En
|
| > et tu crois qu'un tel compilateur pourrait faure quelque chose
| > d'un code C++ écrit ces dix-quinze dernières année ?
|
| Ça dépend de comment on l'écrit. Si une des exigeances du projet
| est de supporter des anciens compilateurs, on peut écrire du
| code qui le fait. (S'il faut, on peut même encore écrire du
| C:-).) Certains projets essaient de le faire, considère
| http://www.mozilla.org/hacking/mozilla-style-guide.html.

oh oui, je connais je machin -- on se demande pourquoi il ne sont pas
resté à C K&R.

-- Gaby


Je remarque que le compilateur ne correspond pas totalement au bouquin

de Bjarne Stroustrup.
Je m'explique:
<code>
struct X{
int a;
int * a;
struct X;
};

typedef struct X *x;
</code>

compile sans problème alors que le bouquin dit que la structure ne
supporte pas l'inclusion de ce type.

Avatar
pascal

pascal wrote:



cette macro a bien un rapport avec l'inclusion du fichier wchar.h ?




Oui et non, à mon avis il faudrait prendre une version plus à jour d e Dev
C++, car la mienne n'a pas l'air d'avoir ce problème :

:/mnt/XP/Dev-Cpp/include$ grep -nri "typedef unsigned short
wchar_t" *
winnt.h:72:typedef unsigned short wchar_t;
:/mnt/XP/Dev-Cpp/include$

dans winnt.h :

#ifndef _WCHAR_T_DEFINED
#define _WCHAR_T_DEFINED
#ifndef _WCHAR_T_
#define _WCHAR_T_
#undef __need_wchar_t
#ifndef __cplusplus
typedef unsigned short wchar_t;
#endif
#endif
#endif

on voit clairement que en C++, ce typedef ne sera JAMAIS effectué.

Quant au _WCHAR_H_ il a en effet rapport avec l'inclusion de wchar.h :
:/mnt/XP/Dev-Cpp/include$ grep -nri _WCHAR_H_ *
wchar.h:14:#ifndef _WCHAR_H_
wchar.h:15:#define _WCHAR_H_
wchar.h:344:#endif /* not _WCHAR_H_ */
:/mnt/XP/Dev-Cpp/include$

Il évite les multiples inclusions de cet en-tête.

Quelle version de Dev-c++ ?


il s'agit de la 4.9.9.0.

j'ai essayé d'installer une version 3.4.2 de gcc-core et gcc-g++,mais
c'est pire,
j'ai des messages que je ne comprends pas du tout:
[Warning] 'nul.gcad' is not a gcov data file
Et les gens de Devcpp,ne repondent pas grand chose a ce sujet.

Et quelle en-tête contient ce problème avec le typedef entre les ifn def
endif de _WCHAR_H_ ?


l'entete est "glut.h"


Je pencherais pour un petit problème dans cette version avec un confli t de
nom entre deux en-tête.






Avatar
Anthony Fleury
pascal wrote:

Je remarque que le compilateur ne correspond pas totalement au bouquin
de Bjarne Stroustrup.
Je m'explique:
<code>
struct X{
int a;
int * a;
struct X;
};


Euh, je n'ai pas testé, mais ca m'étonnerait fort que *CE* code compile
hein. Déjà il y a deux `a' de déclaré. Ensuite, le dernier membre n'a même
pas de nom... quel code compile alors ? faudrait mieux copier/coller le
code qui compile pour éviter ce type d'erreurs.

--
Anthony Fleury

1 2 3