Compiler kennt unbekannte Variable?
-
Ist das vielleicht die Problematik?
#include <iostream> #include <windows.h> int main() { std::cout << MessageBox << std::endl; }
-
Vielleicht ist in einem Header (der nicht von dir ist) ein Makro namens read. Gaaanz böse! Hatt ich schon mal, das ich eine Variable komplett groß geschrieben habe (ich glaub MAXIMUM). ALs ich sie benutzen wollte, hat der Compiler gemeckert, das es ein fehler gibt. Ich wußte nicht wieso. Am Ende stellte sich raus, das es ein Makro von MS war, das natürlich meine Variable bei Benutzung ersetzt hatte.
-
Vergesst es...
-
Hi,
Problem reduziert:
#include <string> #include <iostream> int main( void ) { std::cout << read << std::endl; return 0; }Nur kommt hier jetzt eine Warnung:
chris@daedalus ~/Coding $ g++ -Wall -Wextra -ansi -pedantic -I/usr/include/SDL -D_REENTRANT test.cpp
test.cpp: In functionint main()': test.cpp:6: warning: the address of \ssize_t read(int, void*, size_t)', will always evaluate as `true'Warum kommt die Warnung bei meinem Projekt nicht, obwohl ich dort genau mit den gleichen Schaltern compiliere?
Siehe http://cvs.sourceforge.net/viewcvs.py/serpentes/serpentes/Makefile?view=markupChrisM
-
Was ist die Signatur von toString?
-
Hi,
ganz simpel...
template< typename T > std::string toString( T value ) { std::ostringstream stringStream; stringStream << value; return stringStream.str(); } std::string toString( const struct sockaddr_in& addr );ChrisM
-
Weil in Deinem Fall eine Funktion mit der Funktionspointersignatur (tolles Wort
) von read erstellt wird. Das wäre dann also:std::string toString( ssize_t (*read)(int, void*, size_t) value ) { std::ostringstream stringStream; stringStream << value; return stringStream.str(); }value ist also ein Zeiger auf eine Funktion. Diesen Zeiger darf man nach bool casten und der kann true oder false ergeben, je nachdem ob Du einen NULL-Zeiger reinsteckst. Das kann der Compiler an der Stelle ja nicht wissen.
Bei Deiner Ausgabe (mit Warning) wird das read direkt in einen bool gecastet und da weiss der Compiler, dass gibt immer true.
-
Hi,
aber in meiner toString()-Templatefunktion caste ich in der zweiten Zeile doch auch direkt nach bool, oder?
ChrisM
-
Das ist aber ein Cast wie in der folgenden Routine:
void f( void* x) { if( x) { cout << "true" << endl; } }Der Compiler warnt bei der Abfrage doch auch nicht. x könnte ja auch NULL sein und damit falsch.
In Deiner Template Methode ist es genauso. Dein Template Parameter könnte ja ein NULL Pointer sein.
In Deiner direkten Ausgabe mit cout << read kann read nie ein NULL Pointer sein.
-
Hi,
ach so ja klar, habs verstanden.
Vielen Dank!

ChrisM