 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
PurL Guest
|
Posted: Thu May 27, 2004 10:23 am Post subject: template et #define |
|
|
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
|
Posted: Thu May 27, 2004 10:59 am Post subject: Re: template et #define |
|
|
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
|
Posted: Thu May 27, 2004 11:18 am Post subject: Re: template et #define |
|
|
| 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
|
Posted: Thu May 27, 2004 4:41 pm Post subject: Re: template et #define |
|
|
"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
|
Posted: Thu May 27, 2004 7:10 pm Post subject: Re: template et #define |
|
|
"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
|
Posted: Thu May 27, 2004 7:34 pm Post subject: Re: template et #define |
|
|
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>
--
FLL, Epagneul Breton
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Thu May 27, 2004 7:53 pm Post subject: Re: template et #define |
|
|
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 ;-)
--
FLL, Epagneul Breton
|
|
| Back to top |
|
 |
Alexandre Guest
|
Posted: Fri May 28, 2004 5:07 pm Post subject: Re: template et #define |
|
|
| 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
|
oui, bien sûr. Je voulais dire "quand il y a une autre solution".
| Quote: |
--
FLL, Epagneul Breton
|
|
|
| Back to top |
|
 |
Alexandre Guest
|
Posted: Fri May 28, 2004 5:08 pm Post subject: Re: template et #define |
|
|
oui, c'est grosso modo les seuls cas où je les utilises...
Mais en tout cas ni comme macros ni comme constantes..
| Quote: |
--
FLL, Epagneul Breton
|
|
|
| Back to top |
|
 |
Brieuc Jeunhomme Guest
|
Posted: Sat May 29, 2004 1:36 pm Post subject: Re: template et #define |
|
|
| 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
|
Posted: Sat May 29, 2004 3:16 pm Post subject: Re: template et #define |
|
|
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
|
Posted: Sat May 29, 2004 9:25 pm Post subject: Re: template et #define |
|
|
| 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
|
Posted: Sat May 29, 2004 10:29 pm Post subject: Re: template et #define |
|
|
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
|
Posted: Wed Jun 02, 2004 6:46 am Post subject: Re: template et #define |
|
|
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
|
Posted: Wed Jun 02, 2004 6:07 pm Post subject: Re: template et #define |
|
|
[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 |
|
 |
|
|
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
|
|