MS-Visual Studio et limits : ai-je loupé quelque chose ?

MS-Visual Studio et limits : ai-je loupé quelque chose ? - C++ - Programmation

Marsh Posté le 31-10-2006 à 17:48:39    

Initialiement, mon problème était d'avoir la valeur maximale admise pour un type donné.
 
Dans la foultitude des fichiers include de Microsoft, il existe des define du type MAX_INT (ou quelque chose du genre). Mais je suis aussi tombé sur limits (cf. http://msdn2.microsoft.com/en-us/library/s086ab1z.aspx ou http://gcc.gnu.org/onlinedocs/libs [...] __limitse3).
 
J'ai pu tester l'exemple suivant donné dans la MSDN :

Code :
  1. #include <iostream>
  2. #include <limits>
  3. using namespace std;
  4. int main() {
  5.    cout << "The maximum value for type float is:  "
  6.         << numeric_limits<float>::max( )
  7.         << endl;
  8.    cout << "The maximum value for type double is:  "
  9.         << numeric_limits<double>::max( )
  10.         << endl;
  11.    cout << "The maximum value for type int is:  "
  12.         << numeric_limits<int>::max( )
  13.         << endl;
  14.    cout << "The maximum value for type short int is:  "
  15.         << numeric_limits<short int>::max( )
  16.         << endl;
  17. }

qui donne les résultats escomptés :

Code :
  1. The maximum value for type float is:  3.40282e+038
  2. The maximum value for type double is:  1.79769e+308
  3. The maximum value for type int is:  2147483647
  4. The maximum value for type short int is:  32767

Cependant, dans les fichier en-tête, il y a aussi une macro qui définit max :

Code :
  1. #define max(a, b) (((a) > (b)) ? (a) : (b))

Lorsque je met celle-ci juste après le #include <limits>, j'obtiens alors des erreurs du type :

Avertissement 1 warning C4003: nombre de paramètres réels insuffisants pour la macro 'max' d:\perso\testlimits\testlimits.cpp 11  
Erreur 2 error C2589: '(' : jeton non conforme à droite de '::' d:\perso\testlimits\testlimits.cpp 11  
Erreur 3 error C2059: erreur de syntaxe : '::' d:\perso\testlimits\testlimits.cpp 11  

Le compilateur ne semble pas s'en sortir avec numeric_limits<float>::max( ) et confond avec la macro max...
Est-ce normal ? Ai-je loupé un truc ?  :heink:  
(Je précise que mon projet de test est bien compilé avec /EHsc)
PS: j'ai fait le même test avec gcc sous linux (probablement un version 4.x) et j'ai le même problème....

Reply

Marsh Posté le 31-10-2006 à 17:48:39   

Reply

Marsh Posté le 31-10-2006 à 19:03:38    

C'est classique, il faut juste faire un  
 
#undef min  
#undef max
 
aprés tes includes

Reply

Marsh Posté le 02-11-2006 à 09:09:34    

Oui, merci, c'est ce que j'ai finalement fait :)

Reply

Marsh Posté le 02-11-2006 à 10:50:16    

Quelle est la version de GCC que tu utilises ? J'ai peine à croire que ce soit de la famille 4.x.y
De même, quelle est la version de compilateur (Visual) que tu utilises sous Windows ?
Bon, parce que c'est un reject-valid cinglant. Je veux bien que VC6 se vautre la dessus, mais au delà ...

Reply

Marsh Posté le 02-11-2006 à 11:15:35    

ah mais d'accord, tu définies max après les include standards. (Il vaut mieux utiliser std::max ou std::min à la place de ces macros.)

Reply

Marsh Posté le 02-11-2006 à 11:20:37    

bb138 a écrit :

Le compilateur ne semble pas s'en sortir avec numeric_limits<float>::max( ) et confond avec la macro max...
Est-ce normal ?


Oui. :: est un token de preprocessing; durant la phase de preprocessing, max est ainsi le nom d'une macro qui n'a pas le bon nombre d'arguments.

Reply

Marsh Posté le 04-11-2006 à 12:45:37    

++fab a écrit :

Quelle est la version de GCC que tu utilises ? J'ai peine à croire que ce soit de la famille 4.x.y
De même, quelle est la version de compilateur (Visual) que tu utilises sous Windows ?
Bon, parce que c'est un reject-valid cinglant. Je veux bien que VC6 se vautre la dessus, mais au delà ...


VC6,7 et le express se vautrent toujours la dessu, min,max étant des amcros définis  
dans les en-têtes windows.

Reply

Marsh Posté le 04-11-2006 à 14:08:49    

Joel F a écrit :

VC6,7 et le express se vautrent toujours la dessu, min,max étant des amcros définis  
dans les en-têtes windows.


 
Si (vu que) les entêtes windows ne font pas partie de VC, VC n'est pas responsable  ;)

Reply

Marsh Posté le 04-11-2006 à 18:16:51    

Oui je me comprends ^^

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed