2010-12-01 5 views
0

En ce moment je cherche une version réentrante de wcstok() qui est connue par GCC et d'autres compilateurs (s'il y en a).Plateforme X réentrante wcstok()?

Jusqu'ici j'utilise wcstok_s() mais celui-ci est MSVC seulement et je dois aussi compiler le code sur d'autres plateformes. Alors que certaines pages suggèrent wcstok_r() je ne pouvais pas le trouver dans mes en-têtes GCC. D'autres pages (man) mentionnent strtok_s() sans une version de char large spécifique mais mentionnent qu'il est dit être utilisé pour les chaînes multi-octets seulement (?).

Donc, je suis ouvert aux suggestions. Ecrire mon propre wrapper/version serait une solution de dernier recours seulement.

Modifier pour aschepler: Exemple de code qui ne compile pas en raison de too many arguments - doit compiler en dépit d'être inutile:

#include <cwchar> // includes wchar.h as well 

int main(void) 
{ 
    wchar_t *a, *b, *c; 
    wcstok(a, b, &c); 
    return 0; 
} 
+0

Ajouté une solution de contournement maintenant pour résoudre ce problème - semble que C89 définit un wcstok 2 paramètres et le paramètre 3 a été ajouté quelque temps plus tard dans les années 90 ... globalement très confus, surtout parce qu'il est incohérent dans GCC . – Mario

Répondre

0

La fonction wcstok spécifiée par C89 (et donc C++) est rentrante et a la même signature et essentiellement le même comportement que wcstok_s de Microsoft. wcstok doit être déclaré au <wchar.h> et/ou <cwchar>.

wchar_t* wcstok(wchar_t* s, const wchar_t* delim, wchar_t** ptr); 

Mais il semble que a une signature incorrecte Microsoft wcstok.

Alors peut-être vous pouvez utiliser #ifdef _WINDOWS (plutôt que #ifdef _MSC_VER) pour déterminer quelle fonction utiliser, si vous rencontrez ce problème, même en utilisant gcc sur Windows.

+0

Des définitions supplémentaires sont-elles requises? Mine (GCC 4.5.0 sur Win32) ne prendra pas 3 arguments ('erreur: trop d'arguments pour fonctionner 'wchar_t * wcstok (wchar_t *, const wchar_t *)' '). Était l'une des premières choses à essayer. – Mario

+0

@Mario - Voir éditer. – aschepler

+0

Ce n'est pas un problème de définir la bonne fonction à appeler. Il semble que les fichiers d'inclusion de MinGW fournissent uniquement la version non réentrante (vérifie le fichier de code prétraité). Je pourrais juste "vis" compiler pour Win32 en utilisant GCC mais cela ne ressemble pas à une solution propre que je voudrais. Ajout d'un petit programme de test, j'ai utilisé pour vérifier que ce n'est pas mon autre code ... – Mario

Questions connexes