2010-10-28 23 views
3

Je maintiens un programme open source qui construit avec autoconf.détecter des prototypes de fonctions obsolètes et incorrectes avec autoconf

En ce moment, j'ai un problème avec certains de mes utilisateurs. Ils utilisent une machine virtuelle pré-distribuée d'une organisation qui a un prototype incorrect pour strchr en elle. Leur prototype est:

char *strchr(char *,int c); 

quand bien sûr, nous savons qu'il devrait être:

char *strchr(const char *s,int c); 

(qui lui-même est brisé, que la sortie devrait vraiment être const char *, mais vous ne pouviez pas modifier ce qu'il vous donne si vous avez passé dans un char * et pas un const char *, mais je digresse

Ma question: est-il possible de créer une macro autoconf qui détermine quel prototype est utilisé et de l'utiliser en conséquence? Je préfère ne pas fais dire mon code:

v = strchr((char *)s,c); 

Merci!

Répondre

4

Vous devriez être en mesure de configurer un test de configuration qui tente d'appeler la version const char* (N'utilisez PAS de littéral car il existe une conversion implicite en char*). Configure vous dira si elle a été compilée ou non, vous pouvez donc utiliser quelque chose basé sur cela et l'utiliser pour prendre une décision dans votre code (de préférence dans une sorte de classe wrapper/utilitaire).

Par exemple quelque chose comme (non testé):

AC_TRY_COMPILE([#include <cstring>], 
[const char* str = "Test"; strchr(str, 't');], 
conforming_strchr=yes, 
conforming_strchr=no) 
if test "$conforming_strchr" = yes; then 
    AC_DEFINE(HAVE_CONFORMING_STRCHR, 1, 
    [define to 1 if strchr takes const char*]) 
fi 
+0

Merci. Je vais essayer. – vy32

+0

UVous avez un parent très proche dans la ligne 4. Sinon, cela a fonctionné. Merci! – vy32