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
Marc Boyer
In article <d2ggl8$nkr$, pascal wrote:
#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?


Et oui, le nom est mal choisit. Typedef ne *définit* pas un type,
mais ajoute à l'espace des types (si c'est ça le bon terme) un alias
pour un autre type.

/* != entre typedef et constructeur */
struct X {int i;};
struct Y {int i;};
typedef struct X sX;

struct X x;
struct Y y;
sX sx;

x= sx; /* OK */
sx= x; /* OK */
x= y; /* KO */
y= sx; /* KO */

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.

Avatar
Horst Kraemer
pascal wrote:

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?


Non. La signification des termes *déclaration* et *définition* dans
les normes des langages C++ et C n'est pas identique à l'usage général
de ces termes en informatique.

typedef unsigned short wchar_t

est une *déclaration* qui n'est pas de *définition*.

Les termes "définition" et "déclaration" dans les normes ne s'excluent
pas. Au contraire: tout est déclaration, et de certaines déclarations
sont aussi des définitions.

Voir chapitre 3.1 "Declarations and definitions" de la norme.

--
Horst

--
Lâche pas la patate!

Avatar
pascal

pascal wrote:



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'erreu r :
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?




Non. La signification des termes *déclaration* et *définition* dans
les normes des langages C++ et C n'est pas identique à l'usage géné ral
de ces termes en informatique.

typedef unsigned short wchar_t

est une *déclaration* qui n'est pas de *définition*.

Les termes "définition" et "déclaration" dans les normes ne s'exclue nt
pas. Au contraire: tout est déclaration, et de certaines déclaration s
sont aussi des définitions.

Voir chapitre 3.1 "Declarations and definitions" de la norme.



je veux bien,mais si c'est une déclaration en c++ (car j'ai compilé e n c++),

pourquoi la directive #ifndef ne joue pas sont rôle?
en enlevant le typedef ici,
je peux déclarer un wchar_t dans le code,c'est donc que l'alias du type
short nommé wchar_t est bien pris en compte par le compilateur non?


Avatar
Serge Paccalin
Le jeudi 31 mars 2005 à 14:13, pascal a écrit dans fr.comp.lang.c++ :

j'ai un un entête de fichier avec :

#ifndef _WCHAR_H_
typedef unsigned short wchar_t
#define _WCHAR_H_


je veux bien,mais si c'est une déclaration en c++ (car j'ai compilé en c++),

pourquoi la directive #ifndef ne joue pas sont rôle?
en enlevant le typedef ici,
je peux déclarer un wchar_t dans le code,c'est donc que l'alias du type
short nommé wchar_t est bien pris en compte par le compilateur non?


Oui, et alors ? Il n'y a aucun lien de cause à effet entre l'existence
d'un type nommé wchar_t et l'existence d'une macro de preprocesseur
nommé _WCHAR_H_, sauf dans ton en-tête à toi...

--
___________ 31/03/2005 15:28:28
_/ _ _`_`_`_) 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
pascal

Le jeudi 31 mars 2005 à 14:13, pascal a écrit dans fr.comp.lang.c++ :



j'ai un un entête de fichier avec :

#ifndef _WCHAR_H_
typedef unsigned short wchar_t
#define _WCHAR_H_


je veux bien,mais si c'est une déclaration en c++ (car j'ai compilé en c++),


pourquoi la directive #ifndef ne joue pas sont rôle?
en enlevant le typedef ici,
je peux déclarer un wchar_t dans le code,c'est donc que l'alias du ty pe
short nommé wchar_t est bien pris en compte par le compilateur non?




Oui, et alors ? Il n'y a aucun lien de cause à effet entre l'existence
d'un type nommé wchar_t et l'existence d'une macro de preprocesseur
nommé _WCHAR_H_, sauf dans ton en-tête à toi...



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 merd e
soit la librairie standard.




Avatar
AG
pascal wrote:
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'




j'imagine que quelque part le nom "wchar_t" a été utilisé sans que
_WCHAR_H_ ne soit défini.

souvent le compilateur te donne l'endroit de la première utilisation du
type. Ne l'as-tu pas ?

AG, pour aider ?



Avatar
Gabriel Dos Reis
pascal 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'

Oui. wchar_t est un mot clé C++ qui désigne un type prédéfini. Je ne
comprends pas ce que tu veux que ta déclaration fasse.
Pense un peu à

typedef float double;

| typedef n'est pas comme son nom l'indique,une définition et non une
| déclaration?

son nom l'indique pas grand chose. Le vrai nom, c'est
typeNAMEdef. Quelqu'un a mangé le NAME.

-- Gaby
Avatar
Cyrille
pascal wrote:

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'





j'imagine que quelque part le nom "wchar_t" a été utilisé sans que
_WCHAR_H_ ne soit défini.

souvent le compilateur te donne l'endroit de la première utilisation du
type. Ne l'as-tu pas ?

AG, pour aider ?


Comme le compilateur le dit, wchar_t est un type built-in, prédéfini du
C++, quoi, pas un type définit quelque part dans un en-tête, donc il n'y
a pas d'autre définition de ce type.
L'en-tête qui contient le code incriminé n'est sans doute pas à inclure
dans un programme C++, ou alors il faut désactiver ce bout de code en le
mettant entre les balises
#ifndef __cplusplus
// .....
#endif

--
win the yes need the no to win against the no!




Avatar
Loïc Joly
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
l'occurence, comme le tiens le défini, tu devrais juste définir
_WCHAR_H_ dans ton projet.

Je ne connais pas trop les outils Linux, mais n'est-ce pas justement le
rôle d'un outil comme configure de vérifier ce genre de choses ?

--
Loïc

Avatar
Gabriel Dos Reis
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 ?

-- Gaby
1 2 3