Komische Warnung ...
-
Hallo zusammen,
ich habe folgende for-Schleife:
string s; ... for (size_t i=0; i<strlen(s.c_str()); i++) { ... }
Nun erhalte ich aber beim Compilieren die Warnung:
warning C4018: '<' : Konflikt zwischen signed und unsigned
obwohl doch i genau den Rückgabetyp von strlen hat ... oder irre ich da?
Habt vielen Dank
-
sollte eigenlich aber wiso nimmst du strlen wenn du sowieso nen string hast... die länge wird doch da intern sowieso gespeichert und kannst du direkt mit s.size() erfragen... strlen muss ja sonst erst einmal den kompletten string bis zum nullbyte durchgehen und das bei jedem schleifendurchgang...
-
BartS schrieb:
obwohl doch i genau den Rückgabetyp von strlen hat ... oder irre ich da?
Meiner Meinung nach irrst du, laut MSDN Library:
das findest du wenn du nach strlen suchstsize_t strlen( const char *string ); size_t wcslen( const wchar_t *string ); size_t _mbslen( const unsigned char *string ); size_t _mbstrlen( const char *string );
also ist size_t wie du i definiert hast in verbindung mit strlen ein signed ist
wobei (schau in der MSDN nach size_t) size_t ein unsigned ist.
size_t unsigned integer Result of sizeof operator. STDDEF.H and other include files
Aber ich kann mich auch irren.
-
-
BartS schrieb:
das heißt, der fehler liegt bei MS?
strlen() liefert int und nicht size_t (in C verwendet man oft int statt size_t)
deshalb ist die Warnung korrekt, kann aber ignoriert werden, weil du weißt, dass strlen() nur Werte größer gleich 0 liefern kann (eine negative länge gibt es nicht). uU einen cast einfügen, dann meckert der compiler nicht mehr. (allerdings den hack kommentieren)Mit s.size() hast du das problem übrigens nicht.
-
@Shade
strlen() liefert int und nicht size_t
komischerweise steht bei mir in der msdn auch size_t und nicht int...
Auszug aus der MSDN
size_t strlen( const char *string );
-
Shade Of Mine schrieb:
strlen() liefert int und nicht size_t Mit s.size() hast du das problem übrigens nicht.
vertraust du Kernighan && Ritchie ?
http://www.fh-fulda.de/~klingebiel/c-stdlib/string.htm#s_strlen//edit
The Open Group Base Specifications Issue 6
IEEE Std 1003.1, 2004 Edition
http://www.opengroup.org/onlinepubs/009695399/functions/strlen.html
-
ssm schrieb:
Tatsächlich. Mein Fehler.
strlen liefert wirklich size_tsorry.
-
Welcher Compiler?
VC 7.1 liefert keine Warnung bei /W4
-
peterchen schrieb:
Welcher Compiler?
VC 7.1 liefert keine Warnung bei /W4Vielleicht muss man die 64-Bit Warnungen anschalten.
-
/Wp64 ist auch an.
-
Wenn strlen wirklich size_t liefer ist ja auch klar das keine Warnung kommt.
-
In den CRT-Headern (VC6 und 7) steht auch size_t
deswegen frag ich ja - welcher compiler?
-
vielleicht visual c++ 1, 2, 3, 4 oder 5