Forum Clubic

[C/C++] Utilisation du préprocesseur (#if)

Bonjour,
je cherche à n’effectuer certaines opérations que si la version Opengl du PC compilant (et supposé exécutant) est supérieure ou égale à la version 1.4.


const  char *glVersion = (const char *) glGetString(GL_VERSION); //-->1.4 (2.0.2 NVIDIA 87.76)
char s[4] = {(char) glVersion[0], (char) glVersion[1], (char) glVersion[2], '\0'}; //-->1.4
const float v = atof(s);
int acceptedVersion = (v>=1.4 ? 1 : 0);

cout<<acceptedVersion<<endl; //renvoie "1"

#if (acceptedVersion == 1)
  cout<<"OUI"<<endl;
#endif


Le “OUI” n’est pas écrit.
Alors que si je remplace les instructions préprocesseur par :



#if 1
  cout<<"OUI"<<endl;
#endif


Le "OUI" est écrit.

Je désirerai savoir si quelqu’un avait déjà rencontré ce problème et surtout si ce que je tente de faire est faisable (i.e. : faire lire le contenu d’une variable au préprocesseur).
Merci.

Bonjour,
ça ne peut pas marcher, les variable sont définie à l’exécution, le préprocesseur ne fait qu’évaluer dans tes sources les instructions #qqch pour transformer tes sources pour faire la première passe. l’utilisation des isntruction variables etc. se fait bien après dans les passes suivantes, et comme je disais, les variables ne sont de toutes façons pas évolués à la compil, contrairement aux constantes et aux macros.

http://www.cs.cf.ac.uk/Dave/C/node14.html
http://www.redhat.com/docs/manuals/enterpr…nal-syntax.html
http://en.wikibooks.org/wiki/C++_Programming/Preprocessor

bref normalement, on fait plutôt des #ifdef, #ifndef et #define

je ne sais pas si un #if GL_VERSION > “1.4” pourrait fonctionner puisque les égalités et comparaisons ont l’air d’être sur des entiers uniquement.

Merci.
J’ai fini par comprendre ma bêtise et j’ai réussi à faire ce que je voulais.


void pointsDispAdjust()
{
  glPointSize (2.5);
  glEnable (GL_POINT_SMOOTH); 
  
#if (defined GL_VERSION_1_4) && (GL_VERSION_1_4 == 1)
  PFNGLPOINTPARAMETERFPROC glPointParameterf = (PFNGLPOINTPARAMETERFPROC)glXGetProcAddress((GLubyte*)"glPointParameterf");
  PFNGLPOINTPARAMETERFVPROC glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC)glXGetProcAddress((GLubyte*)"glPointParameterfv");

  float coeffs[] = {0.0f, 0.00001f, 0.01f};
  glPointParameterfv(GL_POINT_DISTANCE_ATTENUATION, coeffs);
  
  //Taille du point
  glPointParameterf (GL_POINT_SIZE_MAX, 32.0);
  glPointParameterf (GL_POINT_SIZE_MIN, 0.2f);
#endif
}


:super:
ça c’est du code :smiley: ça me manque tous ces trucs en java…

/flood

new Troll(){
Ouaip, en plus avec les nouveaux imports static on pourra faire du code goret comme en C :smiley:
}
:ane:

Un "#ifdef GL_VERSION_1_4" ne suffirait-il pas? Ou se peut-il que GL_VERSION_1_4 puisse etre défini et différent de 1?

Dehors les javateux!

(et surtout, vive le D!)

Heu… c’est du C++ pour ma part, avec une orientation plutôt C pour la partie “Vue” de Modèle-Vue-Contrôleur.
Pour


#if (defined GL_VERSION_1_4) && (GL_VERSION_1_4 == 1)

C’est défini comme suit


#define GL_VERSION_1_4 1

Comme je ne savais pas s’il était possible d’avoir

#define GL_VERSION_1_4 0

j’ai préféré prendre une sécurité suplémentaire.