Jeg antager du vil udskrive adressen i memory på et-eller-andet. Hvis det ikke er formålet, er jeg enig med arne_v i at det cast lyder lidt suspekt.
I MSVC 7.1 (Visual Studio .NET) giver følgende: int main() { char p = 0; void * ptr = (void *)&p; long address = (long)ptr; } Følgende warning i default projektopsætning: e:\Projects\cpptest\main.cpp(7) : warning C4311: 'type cast' : pointer truncation from 'void *' to 'long'
Det skyldes at Visual Studio per default slår flaget "Detect 64 bit portability issues" til per default ( /Wp64 ). Så brokker compileren sig over ting, der kan skabe problemer på en 64 bit maskine. Og nævnte cast kan netop skabe problemer , idet en long er 32 bit på begge platforme, mens pointere er 32 bit på en 32 bit platform, og 64 bit på en 64 bit platform.
Hvis din kode aldrig skal køres på en 64 bit maskine, kan du slå warningen fra ved i project settings -> C/C++ -> General - at sætte "Detect 64 bit portability issues" til "No". Med mindre det er et hobbyprojekt eller lignende vil jeg dog i stedet anbefale at caste til en 64 bit datatype - så skulle du være på den sikre side.
Ja, det kan du have ret i. Men der kan selvfølgelig være andre grunde til at man ønsker at lave castet - selvom jeg ikke lige umiddelbart kan komme på hvilke ;-)
Jeg skal fjerne warnings fra flg. stykke kode uden at slå den fra i compiler settings. ( det er ikke tilladt at slå warnings fra i vores projekt ). kompileren vi bruger er MSVC 7.1
void showWin32Console() { static const WORD MAX_CONSOLE_LINES = 500; int hConHandle; void* lStdHandle; CONSOLE_SCREEN_BUFFER_INFO coninfo; FILE *fp; // allocate a console for this app AllocConsole(); // set the screen buffer to be big enough to let us scroll text GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo); coninfo.dwSize.Y = MAX_CONSOLE_LINES; SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize); // redirect unbuffered STDOUT to the console lStdHandle = GetStdHandle(STD_OUTPUT_HANDLE);
hConHandle = _open_osfhandle( (intptr_t)lStdHandle, _O_TEXT); fp = _fdopen( hConHandle, "w" ); *stdout = *fp; setvbuf( stdout, NULL, _IONBF, 0 ); // redirect unbuffered STDIN to the console lStdHandle = GetStdHandle(STD_INPUT_HANDLE); hConHandle = _open_osfhandle((intptr_t)lStdHandle, _O_TEXT); fp = _fdopen( hConHandle, "r" ); *stdin = *fp; setvbuf( stdin, NULL, _IONBF, 0 ); // redirect unbuffered STDERR to the console lStdHandle = GetStdHandle(STD_ERROR_HANDLE); hConHandle = _open_osfhandle((intptr_t)lStdHandle, _O_TEXT); fp = _fdopen( hConHandle, "w" ); *stderr = *fp; setvbuf( stderr, NULL, _IONBF, 0 ); // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog // point to console as well ios::sync_with_stdio(); } ---------------------------------------------
Jeg kan ikke umildbart se at der skulle komme nogen warnings der....
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.