Préprocesseur vérifier existence d'une fonction

Résolu
Fituza Messages postés 23 Date d'inscription mardi 20 avril 2004 Statut Membre Dernière intervention 16 octobre 2008 - 10 oct. 2008 à 01:17
Fituza Messages postés 23 Date d'inscription mardi 20 avril 2004 Statut Membre Dernière intervention 16 octobre 2008 - 13 oct. 2008 à 15:06
Bonsoir,
je souhaiterai trouver un moyen de vérifier l'existence de vsscanf pour définir des fonctions l'utilisant.
Existe t-il une commande préprocesseur qui me permette de le faire?
(Dans le genre #if defined(vsscanf(const char*, const char*, ...)) ou #ifdef)
(Les espaces me gènent en fait :D)
D'avance merci. :)

Fituza

4 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
13 oct. 2008 à 14:49
Salut,

Je ne connais pas de méthode pour savoir si une fonction existe dans une librairie statique (Par contre, on peut sans problème tester l'existence d'une fonction dans une .so ou .dll). Je ne pense pas que ce type de méthode puisse exister du fait de l'architecture de compilation du C (prépro/compilo/linqueur).

Par contre, peut être existe-t-il une variable qui est définie si et seulement si cette fonction est présente -> Si un #define JE_SAIS_PAS_QUOI existe systématiquement quand vsscanf existe. Tu peux jeter un coup d'oeil à la recherche d'une variable de la sorte dans stdarg.h.

Soit dit en passant, vsscanf n'est pas une fonction du standard, donc théoriquement, il ne faudrait pas s'en servir. Elle ne serait absente que sous Windows ce ne serait pas franchement un problème, mais elle semble aussi manquer à certains UNIX.

Bref, le plus sûr reste de réécrire soit même cette fonction... Beaucoup de réécriture de celle-ci se trouve sur le net. Par exemple, tu en as une à la fin de ce post ci.
3
Fituza Messages postés 23 Date d'inscription mardi 20 avril 2004 Statut Membre Dernière intervention 16 octobre 2008
13 oct. 2008 à 15:06
J'ai passé à vrai dire une nuit entière à chercher les diverse réécriture de vsscanf aucune ne m'a convaincu,
soit par ce que le nombre d'argument était limité (un comble pour une fonction elliptique),
soit par ce qu'il avait des fuites de mémoire
ou encor soit par ce qu'elle obligeait à utliser les MFC...

En revanche la fonction vsscanf fait parti du standard C99 ,normalement et tu as raison, on doit pouvoir vérifier son existence grâce au symbole __STDC_VERSION__ mais il me semble (peut-être que je me trompe) qu'il n'est pas disponible sous Visual studio.

Enfin outre vsscanf c'était une vraie question que je posais là en effet ne serait-il pas dommage de ne pas pouvoir choisir entre telle ou telle fonction par rapport aux définitions disponibles point de vu performance?

Bref merci beaucoup de m'avoir répondu. :-)
3
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
10 oct. 2008 à 12:24
salut

#ifdef function_name

ca ne fonctionne pas ?
0
Fituza Messages postés 23 Date d'inscription mardi 20 avril 2004 Statut Membre Dernière intervention 16 octobre 2008
11 oct. 2008 à 01:42
D'une façon heureusement que non (imagine tu as une surcharge de fonction l'une est la mais pas l'autre) et malheuresement pour moi encor non...
Je poste ici un bout de code (bateau à souhait) pour ce qui verrait mieu mon problème avec...
#include
#include <stdarg.h>

using namespace std;


// #ifdef vsscanf(const char* __restrict__, const char* __restrict__, __VALIST) <--- PROBLEME
void function(const char* typelist, ...)
{
va_list arg_ptr;
va_start(arg_ptr, typelist);
vsscanf("Test2 3 5 7 Test3", typelist, arg_ptr);
va_end(arg_ptr);
}
// #endif

int main(int argc, char*argv[])
{
char *typelist = "%s %d %d %d %s";
char str[256], str2[256];
int int1, int2, int3;
strcpy(str, "Test");
// #ifdef vsscanf(const char* __restrict__, const char* __restrict__, __VALIST) <--- PROBLEME
function(typelist, str, &int1, &int2, &int3, str2);
cout<<"str: "<<str<<endl;
cout<<"int: "<<int1<<endl;
cout<<"int: "<<int2<<endl;
cout<<"int: "<<int3<<endl;
cout<<"str2: "<<str2<<endl;
// #else
cout<<"vsscanf n'existe pas!"<<endl;
// #endif

system("pause");
return 0;
}

Fituza
0
Rejoignez-nous