C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

template et #define
Goto page 1, 2  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
PurL
Guest





PostPosted: Thu May 27, 2004 10:23 am    Post subject: template et #define Reply with quote



Bonjour,

je définis une fonction d'écriture de données dans un fichier et j'utilise
les templates pour pouvoir spécifier le type de la donnée à écrire :

template <class type> void WriteData(type data)
{
m_fichier->Write(&data, sizeof(type));
}

je l'utilise ainsi :

WriteData<int>(10);
WriteData<int>(ma_variable);

et ca marche bien.

Par contre je définis aussi :

#define ENTETE_VERSION 6

et quand je fais :

WriteData<int>(ENTETE_VERSION);

mon compilateur m'indique :
[C++ Erreur] UnitFichier.cpp(32): E2121 ) manquante dans l'appel de fonction
[C++ Erreur] UnitFichier.cpp(32): E2188 Syntaxe de l'expression

Pourquoi cette erreur ?

Merci,

Note : je suis sous BCB5

PurL.


Back to top
Amerio
Guest





PostPosted: Thu May 27, 2004 10:59 am    Post subject: Re: template et #define Reply with quote



PurL wrote:
Quote:
[...]
Par contre je définis aussi :

#define ENTETE_VERSION 6

et quand je fais :

WriteData<int>(ENTETE_VERSION);

mon compilateur m'indique :
[C++ Erreur] UnitFichier.cpp(32): E2121 ) manquante dans l'appel de
fonction
[C++ Erreur] UnitFichier.cpp(32): E2188 Syntaxe de l'expression

Pourquoi cette erreur ?

A tout hasard, tu n'aurais pas un point-virgule a la fin de ton define ?
#define ENTETE_VERSION 6 ;
au lieu de
#define ENTETE_VERSION 6

Si ce n'est pas ca, essaye de voir le fichier généré par le precompilateur.
Ya une option sur certains compilo (mais je ne connais pas BCB5)



Back to top
PurL
Guest





PostPosted: Thu May 27, 2004 11:18 am    Post subject: Re: template et #define Reply with quote



Quote:
A tout hasard, tu n'aurais pas un point-virgule a la fin de ton
define ? #define ENTETE_VERSION 6 ;
au lieu de
#define ENTETE_VERSION 6

et bam ! en plein dedans !
Merci pour ton aide, j'essairai de faire plus attention la prochaine fois...

PurL



Back to top
Alexandre
Guest





PostPosted: Thu May 27, 2004 4:41 pm    Post subject: Re: template et #define Reply with quote


"PurL" <purl-nospam (AT) chez (DOT) com> a écrit dans le message de
news:c94in0$848$1 (AT) news-reader5 (DOT) wanadoo.fr...
Quote:
A tout hasard, tu n'aurais pas un point-virgule a la fin de ton
define ? #define ENTETE_VERSION 6 ;
au lieu de
#define ENTETE_VERSION 6

et bam ! en plein dedans !
Merci pour ton aide, j'essairai de faire plus attention la prochaine
fois...

PurL



d'où le gros danger des #define... Tu aurais fait
const int ENTETE_VERSION = 6;
tu n'aurais pas eu de pb car le compilo aurait pu detecter un ; en moins....

Franchement, à part les #define MACHIN_H pour prévenir les inclusions
multiples (#infdef MACHIN_H...#endif) qui peut me donner un avantage des
#define justifiant leur utilisation en C++ ? pour les macros mieux vaut une
fonction (inline à la rigueur), un template, etc... et pour les constantes
mieux vaut... une constante.



Back to top
Matthieu Moy
Guest





PostPosted: Thu May 27, 2004 7:10 pm    Post subject: Re: template et #define Reply with quote

"Alexandre" <alex.g (AT) netcourrier (DOT) com> writes:

Quote:
qui peut me donner un avantage des #define justifiant leur
utilisation en C++ ?

Il y a toujours le cas

#ifdef SYSTEM_HAS_FEATURE_XXX
#include "header_providing_XXX.h"
#endif

....

#ifdef SYSTEM_HAS_FEATURE_XXX

du code utilisant header_providing_XXX.h

#endif

Ou bien des "vraies" macros, qui jouent avec les identificateurs :

#define DUMP(x) cout << #x << " = " << x << endl

Mais bon, sinon, les macros, ça sert surtout à faire des erreurs de
syntaxe, des messages d'erreurs incompréhensibles du compilateur, à
empêcher le débuggeur de faire son boulot, ... Ah, et ça sert surtout
à rassurer les programmeurs C. ;-)

--
Matthieu

Back to top
Fabien LE LEZ
Guest





PostPosted: Thu May 27, 2004 7:34 pm    Post subject: Re: template et #define Reply with quote

On Thu, 27 May 2004 18:41:04 +0200, "Alexandre"
<alex.g (AT) netcourrier (DOT) com> wrote:

Quote:
qui peut me donner un avantage des
#define justifiant leur utilisation en C++ ?

Herb Sutter.
<http://www.gotw.ca/gotw/032.htm>

--
Wink
FLL, Epagneul Breton

Back to top
Fabien LE LEZ
Guest





PostPosted: Thu May 27, 2004 7:53 pm    Post subject: Re: template et #define Reply with quote

On Thu, 27 May 2004 18:41:04 +0200, "Alexandre"
<alex.g (AT) netcourrier (DOT) com> wrote:

Quote:
qui peut me donner un avantage des #define

Le mot "avantage" est AMHA mal choisi : généralement, #define n'a pas
d'avantages sur d'autres solutions, c'est juste qu'on le choisit parce
qu'il n'y a pas d'autre solution ;-)

--
Wink
FLL, Epagneul Breton

Back to top
Alexandre
Guest





PostPosted: Fri May 28, 2004 5:07 pm    Post subject: Re: template et #define Reply with quote

Quote:

Le mot "avantage" est AMHA mal choisi : généralement, #define n'a pas
d'avantages sur d'autres solutions, c'est juste qu'on le choisit parce
qu'il n'y a pas d'autre solution Wink

oui, bien sûr. Je voulais dire "quand il y a une autre solution".


Quote:

--
Wink
FLL, Epagneul Breton



Back to top
Alexandre
Guest





PostPosted: Fri May 28, 2004 5:08 pm    Post subject: Re: template et #define Reply with quote

Quote:

Herb Sutter.
http://www.gotw.ca/gotw/032.htm

oui, c'est grosso modo les seuls cas où je les utilises...
Mais en tout cas ni comme macros ni comme constantes..

Quote:

--
Wink
FLL, Epagneul Breton



Back to top
Brieuc Jeunhomme
Guest





PostPosted: Sat May 29, 2004 1:36 pm    Post subject: Re: template et #define Reply with quote

Quote:
Franchement, à part les #define MACHIN_H pour prévenir les inclusions
multiples (#infdef MACHIN_H...#endif) qui peut me donner un avantage des
#define justifiant leur utilisation en C++ ?

Peut-être pour l'optimisation, sur ce genre de code:

int i;
for ( i = 0 ; i < CONSTANTE ; i ++ ) { ... }

Dans le cas où constante est issu d'un #define, le compilateur peut
dérouler la boucle, mais le fait-il dans le cas d'une définition de
variable const ? Je ne connais pas bien C++, mais même quand une
variable est marquée const, elle peut quand même être modifiée avec des
choses sales du genre ça, non ?

const int i;
scanf( "%dn", (int *) &i );

Donc le compilateur ne peut pas être certain que la constante est
vraiment constante, à moins qu'une ruse m'ait échappé.

--
BBP

Back to top
James Kanze
Guest





PostPosted: Sat May 29, 2004 3:16 pm    Post subject: Re: template et #define Reply with quote

Brieuc Jeunhomme <bbp (AT) via (DOT) ecp.fr> writes:

Quote:
Franchement, à part les #define MACHIN_H pour prévenir les
inclusions multiples (#infdef MACHIN_H...#endif) qui peut me
donner un avantage des #define justifiant leur utilisation en C++
?

Peut-être pour l'optimisation, sur ce genre de code:

int i;
for ( i = 0 ; i < CONSTANTE ; i ++ ) { ... }

Dans le cas où constante est issu d'un #define, le compilateur
peut dérouler la boucle, mais le fait-il dans le cas d'une
définition de variable const ?

Je ne connais pas bien C++, mais même quand une variable est
marquée const, elle peut quand même être modifiée avec
des choses sales du genre ça, non ?

const int i;
scanf( "%dn", (int *) &i );

Non. C'est un comportement indéfini.

Reflechis-y un moment. Je peux bien écrire :

int const size = 42 ;

char buffer[ size ] ;

Quel en serait la signification si size pourrait être modifié ?

Je crois que tu confonds avec des choses comme :

int i = 42 ;

void
f( int const& param )
{
std::cout << param << 'n' ;
++ i ;
std::cout << param << 'n' ;
++ const_cast< int& >( param ) ;
std::cout << param << 'n' ;
}

int
main()
{
f( i ) ;
return 0 ;
}

Ce programme a un comportement défini, et doit sortir :

42
43
44

quelque soit le compilateur utilisé à le compiler. Le compilateur
ne peut pas supposer dans f que ce qui est référencé par param
est const. De même, quand il génère l'appel à f, il ne peut
pas supposer que son paramètre ne serait pas modifié.

Quote:
Donc le compilateur ne peut pas être certain que la constante est
vraiment constante, à moins qu'une ruse m'ait échappé.

La seule « ruse », c'est la définition du langage.

--
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

Back to top
Brieuc Jeunhomme
Guest





PostPosted: Sat May 29, 2004 9:25 pm    Post subject: Re: template et #define Reply with quote

Quote:
Je crois que tu confonds avec des choses comme :

int i = 42 ;

void
f( int const& param )
{
std::cout << param << 'n' ;
++ i ;
std::cout << param << 'n' ;
++ const_cast< int& >( param ) ;
std::cout << param << 'n' ;
}

Ah non, il n'y a pas de risque, vu que j'ignore ce qu'est un const_cast.
La ligne avec le const_cast change quelque chose par rapport à
++ (int &) ( param ); ?

Au cours de mes essais, j'ai essayé de définir une variable const dans
un fichier et d'y accéder en la déclarant comme extern const dans un
autre. Ca passait à la compilation, mais pas à l'édition de liens...
const implique static ?

--
BBP

Back to top
Anthony Fleury
Guest





PostPosted: Sat May 29, 2004 10:29 pm    Post subject: Re: template et #define Reply with quote

Brieuc Jeunhomme wrote:

Quote:
Je crois que tu confonds avec des choses comme :

int i = 42 ;

void
f( int const& param )
{
std::cout << param << 'n' ;
++ i ;
std::cout << param << 'n' ;
++ const_cast< int& >( param ) ;
std::cout << param << 'n' ;
}

Ah non, il n'y a pas de risque, vu que j'ignore ce qu'est un const_cast.
La ligne avec le const_cast change quelque chose par rapport à
++ (int &) ( param ); ?

Ca revient au même. Par contre, const_cast<> est fait pour ce genre
d'utilisations (c'est un peu la même chose que la différence entre un
static_cast<> et un cast à la C). En fait, il est utilisé pour dire : "Je
sais que le paramètre qui m'est passé est constant, mais je veux le
modifier quand même."
Seulement, l'exemple de James a un comportement défini, mais ce n'est pas le
cas si la variable est *vraiment* constante :

const int i = 42;

void f(const int& p) {
++ const_cast< int& > (p);
}

int main() {
f(i);
}

Sur un vrai système d'exploitation, ce code affichera "Segmentation
Fault" (ou équivalent).

const_cast<> est donc utilisé pour enlever le caractère constant d'un
paramètre référence ou pointeur, afin de modifier l'objet référencé ou
pointé si celui ci n'est pas constant.

Quote:

Au cours de mes essais, j'ai essayé de définir une variable const dans
un fichier et d'y accéder en la déclarant comme extern const dans un
autre. Ca passait à la compilation, mais pas à l'édition de liens...
const implique static ?


Par défaut, les variables déclarées en const ont un linkage interne. Il faut
donc écrire :

1.cpp

extern const int i = 42;

2.cpp :

#include <iostream>
extern const int i;

int main() {
std::cout << i << std::endl;
}

Anthony
--
It's a bird.. It's a plane..
No, it's KernelMan, faster than a speeding bullet, to your rescue.
Doing new kernel versions in under 5 seconds flat..
-- Linus, in the announcement for 1.3.27

Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Wed Jun 02, 2004 6:46 am    Post subject: Re: template et #define Reply with quote

Brieuc Jeunhomme <bbp (AT) via (DOT) ecp.fr> wrote


Quote:
Je crois que tu confonds avec des choses comme :

int i = 42 ;

void
f( int const& param )
{
std::cout << param << 'n' ;
++ i ;
std::cout << param << 'n' ;
++ const_cast< int& >( param ) ;
std::cout << param << 'n' ;
}

Ah non, il n'y a pas de risque, vu que j'ignore ce qu'est un
const_cast. La ligne avec le const_cast change quelque chose par
rapport à ++ (int &) ( param ); ?

Dans ce cas-ci, non. L'avantage de const_cast, c'est que le compilateur
aurait hurlé si tu l'avait écrit « const_cast< double& > », tandis
qu'avec ta version, ç'aurait passé la compilation, mais aurait sans
doute donné des problèmes à l'execution.

Si tu voulais vraiment traiter des entiers en double, parce que par
exemple tu les a bien rempli en connaissant la représentation des
doubles, il y a un reinterpret_cast qui le permet. Mais tu risque pas de
le faire accidentalement avec const_cast, quand ton seul but était de
changer le const.

Quote:
Au cours de mes essais, j'ai essayé de définir une variable const dans
un fichier et d'y accéder en la déclarant comme extern const dans un
autre. Ca passait à la compilation, mais pas à l'édition de liens...
const implique static ?

Pour Dieu sait quelle raison, oui, quand le const se trouve à la portée
de namespace. Pour contourner le problème, je précise toujours ou static
ou extern, par exemple :

static int const localInt = 42 ;
extern int const globalInt = 100 ;

Et dans le .hh :

extern int const globalInt ;

Ça me fait toujours drôle d'utiliser le mot clé « extern » pour une
définition, et non seulement pour une déclaration, mais c'est comme ça.
(C'est moins genant que d'appeler « remove » une fonction qui reordonne
un tableau sans rien enlever.)

--
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

Back to top
Loïc Joly
Guest





PostPosted: Wed Jun 02, 2004 6:07 pm    Post subject: Re: template et #define Reply with quote

[email]kanze (AT) gabi-soft (DOT) fr[/email] wrote:

Quote:
Ça me fait toujours drôle d'utiliser le mot clé « extern » pour une
définition, et non seulement pour une déclaration, mais c'est comme ça.
(C'est moins genant que d'appeler « remove » une fonction qui reordonne
un tableau sans rien enlever.)

Elle ne fait pas que réordonner, elle rend aussi les éléments "à la fin"
non valides. Mais effectivement, elle n'enlève pas vraiment.

--
Loïc


Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.