[gull] cours C++

Marc Mongenet marc.mongenet at gmail.com
Fri Feb 24 11:47:52 CET 2006


2006/2/24, Daniel Cordey <dc at mjt.ch>:
> Et pour ceux que les problemes de semantique genent, on peut tres bien aussi
> ecrire :
>
> #define ==      EQUAL
> #define ==      EQUIVALENT
> etc.
>
> Naturelllement, en C++, les operateurs de classes doivent etre utilises pour
> pouvoir continuer a utilise ces macros de maniere generique. C'est moins
> complique qu'il n'y parait.

Que veux-tu dire par "operateurs de classes" ?
Il me semble que ces macros restent utilisables partout à la place de ==,
il faut juste penser à insérer des espaces si on fait un chercher/remplacer.
x=a==b;
x=a EQUAL b;  // et pas x=aEQUALb;

> J'ai un paquet de define que j'utilise depuis de nombreuses annees mais je ne
> comprends pas pourquoi personne n'a fait la meme chose. C'est tellement
> trivial que ca me sidere. La puissance des macros du pre-pcocesseur C/C++ est
> enorme et negligee.
>
> dc

Oour des macros d'intérêt universel comme ça, les macros peuvent
être sympa. Mais ça détruit vraiment toute la sémantique du langage
dans la plupart des autres cas, c'est pour ça que les concepteurs de
C++ les rejettent avec force. Franchement, les macros méritent la
plus grande méfiance, non ?


#include <stdlib.h>

namespace my_utils {
	#define MAX1(a,b) ((a) > (b) ? (a) : (b));
	template <class C> bool MAX2(C a, C b) { return a > b ? a : b; }
}

int main()
{
	int i1 = MAX1(1,2);
	int i2 = MAX1(i1++, 2);
	int i3 = my_utils::MAX1(1,2);
	bool (*pcmp) (int, int) = MAX1;
	malloc MAX1(1,2);
}


Que des problèmes :
i1) L'encapsulation n'est pas respectée.
i2) MAX1(i1++,2) peut incrémenter plusieurs fois i1.
i3) L'encapsulation n'est pas respectable.
i4) On ne peut pas manipuler MAX1 comme une fonction (prendre l'adresse).
malloc) Ça compile, sans commentaire.

Avec le template, ce qui doit compiler compile correctement et
le reste pas du tout :
	int i1 = MAX2(1,2);   // KO
	int i2 = my_utils::MAX2(i1++, 2);  // OK
	int i3 = my_utils::MAX2(1,2);  // OK
	bool (*pcmp) (int, int) = my_utils::MAX2;  // OK
	malloc my_utils::MAX2(1,2);   // KO


Marc Mongenet



More information about the gull mailing list