Modification mini-invasive de strchr sur un caractère non signé * en C ++ à partir d’une base de code C?

J’essaie de comstackr une base de code C en tant que C ++, en peaufinant certains des inclus. Il utilise strchr() sur les pointeurs de caractères non signés, par exemple:

 #include  #include  // Cannot modify this file with any non-C-isms, but let's say an include can // be changed (although all things being equal I'd rather not) #include  int main(int argc, char* argv[]) { unsigned char b = 'B'; unsigned char const * str = "ABC"; unsigned char const * pos = strchr(str, b); if (pos) { printf("position is %d\n", pos - str); } return 0; } 

Cela provoque une erreur en C ++ (pour des raisons expliquées ailleurs) … même avec -fpermissive .

 test.c: In function 'int main(int, char**)': test.c:6:33: warning: invalid conversion from 'const char*' to 'const unsigned char*' [-fpermissive] test.c:7:46: error: call of overloaded 'strchr(const unsigned char*&, unsigned char&)' is ambiguous test.c:7:46: note: candidates are: In file included from test.c:1:0: /usr/include/ssortingng.h:215:14: note: char* strchr(char*, int)  /usr/include/ssortingng.h:215:14: note: no known conversion for argument 1 from 'const unsigned char*' to 'char*' /usr/include/ssortingng.h:217:22: note: const char* strchr(const char*, int)  /usr/include/ssortingng.h:217:22: note: no known conversion for argument 1 from 'const unsigned char*' to 'const char*' 

Habituellement, quand je suis confronté à ce genre de choses, je vais “strchr, beurk, il suffit de m’en débarrasser complètement” . Mais je ne veux pas modifier ces fichiers moi-même, et c’est du code C qui est gardé très portable sur des plates-formes plutôt anciennes. Ils ne seraient pas contents de lancer des appels sur des sites pour apaiser le C ++ … même si un “struchr” existait et était standard, ils l’utilisaient probablement.

Je peux aussi en parler d’une manière ou d’une autre, comme dans SomethingICanChange.h je pourrais append:

 unsigned char const * strchr(unsigned char const * s, int c) { return (unsigned char const *)strchr((char const *)s, c); } 

Cela fonctionne avec -fpermissive . Mais je ne serais pas capable de vérifier cette surcharge dans la base de code C (enfin, sans #ifdef). Je me demandais simplement si quelqu’un avait une meilleure idée, je proposerai d’append struchr si c’est ce que les gens dans cette situation struchr par faire (ou quel que soit le nom commun s’il existe un nom commun).

    Note initiale : Je suis conscient que c’est aussi une chose laide à faire, mais cela pourrait vous aider avec une meilleure idée (espérons-le)!

    Que diriez-vous d’utiliser une macro:

     #define strchr(s, c) ((unsigned char const *)strchr((char const *)s, c)) 

    Vous pouvez l’inclure en tant qu’indicateur de compilation (-D) à partir de votre script Makefile / build. Je suppose que vous avez un script Makefile / build personnalisé pour votre projet C ++, vous n’avez donc pas besoin d’append cette macro à la base de code C.

    Pour le rendre légèrement meilleur, vous pouvez utiliser un fichier supplémentaire, que vous incluez à partir de votre script Makefile / build, qui ajoute ces macros de manière (plus) structurée à CPPFLAGS