Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1308 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Cast dans un #define : questions

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Cast dans un #define : questions

n°1271408
Elmoricq
Modérateur
Posté le 21-12-2005 à 17:05:41  profilanswer
 

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 ?

mood
Publicité
Posté le 21-12-2005 à 17:05:41  profilanswer
 

n°1271535
Elmoricq
Modérateur
Posté le 21-12-2005 à 20:04:29  profilanswer
 

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]

n°1272113
Emmanuel D​elahaye
C is a sharp tool
Posté le 22-12-2005 à 23:16:21  profilanswer
 

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/
n°1272120
Elmoricq
Modérateur
Posté le 22-12-2005 à 23:33:04  profilanswer
 

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
n°1272379
Emmanuel D​elahaye
C is a sharp tool
Posté le 23-12-2005 à 12:03:20  profilanswer
 

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/
n°1272384
chrisbk
-
Posté le 23-12-2005 à 12:06:36  profilanswer
 

ca lui fait la bite [:dr_zoidberg]

n°1272385
Elmoricq
Modérateur
Posté le 23-12-2005 à 12:07:09  profilanswer
 

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.

n°1272388
Elmoricq
Modérateur
Posté le 23-12-2005 à 12:08:56  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Cast dans un #define : questions

 

Sujets relatifs
2 questions sur les CSS[Caml] Quelques questions
deux questions... chargement XML et faire apparaitre les elements[Cognos/ReportNet] Pb de cast
[VBS] Questions à 2 balles (0.30€) pour ultra-débutants[SQL] Questions basiques sur SQL
Questions : Classpath et Jar executable2 questions sur frontpage d'un ultra débutant
EBCDIC, ASCII, ASCII Etendu et Unicode -> questions[CSS] mon nouveau site, pleins de questions a la con
Plus de sujets relatifs à : Cast dans un #define : questions


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR