Cast dans un #define : questions

Cast dans un #define : questions - C - Programmation

Marsh Posté le 21-12-2005 à 17:05:41    

Je suis en train de développer une surcouche à la ctlib, l'API Sybase que je trouve particulièrement mal fichue (ils ont remplacé la dblib, qui était pas mal du tout, par cette infâmie, ça c'est de l'évolution).
 
Bon, bref.
Dans ma surcouche, je me décide de configurer une connexion standard, en ajustant un certain nombre de paramètres. Or suivant les versions, tous les paramètres ne sont pas connus, je pensais donc utiliser le préprocesseur, par exemple :
 

Code :
  1. CS_INT properties[][2] =
  2. {
  3.   {CS_ANSI_BINDS,      CS_TRUE},
  4.   {CS_NETIO,           CS_SYNC_IO},
  5.   {CS_NO_TRUNCATE,     CS_TRUE},
  6. #if CS_CURRENT_VERSION > CS_VERSION_100
  7.   {CS_EXTERNAL_CONFIG, CS_FALSE},
  8. #endif
  9.   {NULL, NULL}
  10. };


 
 
Seulement voila, avec cet exemple, cc il est pas content (missing operator, qu'il me dit).
 
J'ai cherché, et j'ai trouvé pourquoi : toutes les macros Sybase sont définies avec un cast.
Et les casts le préprocesseur il ne connait pas, d'où non-compilation.
 
Exemple :

#define CS_VERSION_125 (CS_INT)12500


 
Questions :  

  • y a-t-il une bonne raison, qui m'échapperait, pour qu'un cast soit imposé pour chaque macro possible et imaginable, et notamment pour un numéro de version ? (je suis sérieux : avant de hurler que c'est de la merde, je veux être sûr qu'il n'y a pas une bonne raison derrière)


  • A part se passer du préprocesseur (ce qui dans mon cas va un peu alourdir le code), y a moyen de circonvenir à ce comportement ?

Reply

Marsh Posté le 21-12-2005 à 17:05:41   

Reply

Marsh Posté le 21-12-2005 à 20:04:29    

Face à ce déluge de réponses, j'en déduis que la CTLib de Sybase, c'est de la merde.  
Je veux dire : maintenant je sais que c'est pas que leur doc, qui à elle seule vaut le détour  [:moule_bite]
 
Bon, plus qu'à mettre plein de if() pour tester la version du bousin, old-school style  [:zytrasnif]

Reply

Marsh Posté le 22-12-2005 à 23:16:21    

Elmoricq a écrit :

J'ai cherché, et j'ai trouvé pourquoi : toutes les macros Sybase sont définies avec un cast.
Et les casts le préprocesseur il ne connait pas, d'où non-compilation.
 
Exemple :

#define CS_VERSION_125 (CS_INT)12500


 
Questions :  

  • y a-t-il une bonne raison, qui m'échapperait, pour qu'un cast soit imposé pour chaque macro possible et imaginable, et notamment pour un numéro de version ? (je suis sérieux : avant de hurler que c'est de la merde, je veux être sûr qu'il n'y a pas une bonne raison derrière)


  • A part se passer du préprocesseur (ce qui dans mon cas va un peu alourdir le code), y a moyen de circonvenir à ce comportement ?


Ajouter dans un include (AMA, il y est déjà...)

#define CT_INT int


ou  

typedef int CT_INT;


Ca, ça compile ?

Code :
  1. CS_INT properties[][2] = <...>


Il y a un CS_INT !


Message édité par Emmanuel Delahaye le 22-12-2005 à 23:17:23

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 22-12-2005 à 23:33:04    

Je n'ai pas compris ce que tu voulais dire, mais CS_INT est bien défini en fait (avec un typedef int dans mon cas, mais ça change selon les plateformes)
 
Ce qui gène ce sont les parenthèses dans le #define, qui font qu'on ne peut pas utiliser cette macro avec #if/#elif :/

Message cité 1 fois
Message édité par Elmoricq le 22-12-2005 à 23:35:02
Reply

Marsh Posté le 23-12-2005 à 12:03:20    

Elmoricq a écrit :

Je n'ai pas compris ce que tu voulais dire, mais CS_INT est bien défini en fait (avec un typedef int dans mon cas, mais ça change selon les plateformes)
 
Ce qui gène ce sont les parenthèses dans le #define, qui font qu'on ne peut pas utiliser cette macro avec #if/#elif :/


Exact, car au moment où les macros sont évaluées, une typedef ne l'est pas. Par contre, ça ne devrait pas géner si CS_INT est défini par une macro au lieu d'un typedef.
 
De toutes façon, ce cast est absurde. Dans une macro, une constante numérique (sans qualificateur) est de type int.
 

  • 123 -> int
  • 123u -> unsigned int
  • 123l -> long int
  • 123ul -> unsigned long int

etc.
 
Tant que la constante numérique ne dépasse pas 32767 (valeur minimale de INT_MAX garantie par le norme), ca reste portable.
 

Message cité 1 fois
Message édité par Emmanuel Delahaye le 23-12-2005 à 12:04:49

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 23-12-2005 à 12:06:36    

ca lui fait la bite [:dr_zoidberg]

Reply

Marsh Posté le 23-12-2005 à 12:07:09    

Emmanuel Delahaye a écrit :

Exact, car au moment où les macros sont évaluées, une typedef ne l'est pas. Par contre, ça ne devrait pas géner si CS_INT est défini par une macro au lieu d'un typedef.


 
Ah oui très juste, je n'avais même pas envisagé cette question sous cet angle.
 
 

Emmanuel Delahaye a écrit :

De toutes façon, ce cast est absurde. Dans une macro, une constante numérique (sans qualificateur) est de type int.


 
Ca confirme ce que je pensais, donc. :/
Bon j'ai contourné, mais je trouve ça dommage de devoir gérer les versions dans le code directement, au lieu de désactiver certaines parties du code en fonction de la version courante.

Reply

Marsh Posté le 23-12-2005 à 12:08:56    

chrisbk a écrit :

ca lui fait la bite [:dr_zoidberg]


 
Tu m'étonnes. Je passe d'une dizaine de fonctions à appeler pour établir la connexion Sybase, à une seule bête fonction.
Bon c'est un paramétrage par défaut mais on peut toujours régler le paramétrage après coup si on a besoin d'un truc exotique.
Comme quoi, c'est largement simplifiable leur bazar.
 
Je hais cette API.
 
 
Et encore pour pouvoir compiler, il faut inclure les bibliothèques suivantes :  -lct -lcs -lcomn -ltcl -lintl -ldl -lnsl -lmp  
On peut n'en retirer aucune, elles dépendent toutes les unes des autres.  [:moule_bite]  
Avec la dblib, on faisait -ldb et ça roulait.
 
Je demande donc la pendaison des développeurs de Sybase. [:moule_bite]


Message édité par Elmoricq le 23-12-2005 à 12:11:09
Reply

Sujets relatifs:

Leave a Replay

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