strlen()
-
Beim Aufruf von strlen() mit einem unsigned char * als Argument zu casten ist zum einen nicht notwendig und nutzt zum anderen nichts.
Die vermeintliche Lösung mit dem Makro ist nicht gut, denn sie verschleiert das eigentliche Problem:Ob die Funktionen aus der string.h mit unsigned char-Werten funktionieren ist nicht vorhersagbar! strlen() wird wohl gehen, strcmp() vermutlich nicht.
Der Ansatz von (D)Evil ist der richtige, nämlich eine eigene Funktion ustrlen() zu schreiben. (Allerdings ohne "ustrlen(NULL) == 0"...)
-
na gut, dann eben kein makro
aber vielleicht so://#include <string.h> // <--- auskommentieren extern size_t strlen (unsigned char*); // <--- das da hinschreiben ... unsigned char us[] = {1,2,3,0}; size_t x = strlen(us); // <--- tätä ! ...
-
@Undertaker: Und woher soll strlen() dann kommen?
Die Funktionssignatur von (D)Evils Funktion kann ich nicht so recht deuten. Was soll denn das zweite const bedeuten?
(D)Evil schrieb:
[cpp]inline size_t ustrlen(const unsigned char* const string) {[/cpp]
Aber müsste ich ustrlen() global in meinem Projekt zur Verfügung stellen würde ich diese Funktion schreiben:
unsigned int ustrlen(const unsigned char *string) { return strlen((const char*)string); }
-
martin_salo schrieb:
Und woher soll strlen() dann kommen?
Die kommt immernoch daher wo sie vorher auch herkam. Du behauptest gegenüber dem Compiler nur, dass die Funktion einen unsigned char* bekommt, entgegen dem was der Erzeuger der Standardbibliothek sich gedacht hat.
-
Der Linker würde doch nach einem "size_t strlen (unsigned char*)" suchen aber nur ein "size_t strlen (const char*)" finden und deshalb meckern?
-
Der Linker sucht nur nach der Funktion strlen - und C-Compiler codieren idR keine Typ-Informationen in den dekorierten Funktionsnamen (weil's in C nicht notwendig ist). Wenn du das Ding unter C++ verwenden willst, kann das durchaus zu einem Problem werden (Stichwort: Überladungen).
-
Ach so. Danke
Was sagt hier eigentlich die 2 const aus:
inline size_t ustrlen(const unsigned char* const string)
Wenn ich der Funktion "strlen(const char *str)" etwas übergeb sagt mir das const das an den übergebenen Daten nichts verändert wird. Was bewirkt das 2te const von oben zusätzlich?
-
Das sagt dir, daß die Funktion den übergebenen Zeiger nicht verändert (aber da dieser Zeiger sowieso eine Kopie des Arguments ist, ist das eigentlich bedeutungslos).
-
zum thema 'const' guckt ihr auch: http://c2.com/cgi/wiki?ConstIsaVirus und http://c2.com/cgi/wiki?AvoidConstCompletely
-
Ok vielen Dank