Préprocesseur vérifier existence d'une fonction [Résolu]

Signaler
Messages postés
23
Date d'inscription
mardi 20 avril 2004
Statut
Membre
Dernière intervention
16 octobre 2008
-
Messages postés
23
Date d'inscription
mardi 20 avril 2004
Statut
Membre
Dernière intervention
16 octobre 2008
-
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

Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
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.
Messages postés
23
Date d'inscription
mardi 20 avril 2004
Statut
Membre
Dernière intervention
16 octobre 2008

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. :-)
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
39
salut

#ifdef function_name

ca ne fonctionne pas ?
Messages postés
23
Date d'inscription
mardi 20 avril 2004
Statut
Membre
Dernière intervention
16 octobre 2008

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