R0 CREW

CPP Warning's: macro redefinition ### see previous definition of ###

Небольшая заметка для новичков освоваивающих cpp,
Если у вас в хедерах идет инициализация системных дифинишенов (например если вы используете boost)

#ifdef WIN32

 #include <winsock2.h>
 #include <errno.h>

 #define EADDRNOTAVAIL WSAEADDRNOTAVAIL
...

С9499 Warning: macro redefinition EADDRNOTAVAIL see previous definition of errno.h

Для того чтобы исправить эту проблему, нужно очистить предыдущий вызов функцией:

#undef EADDRNOTAVAIL

те новый код будет:

#ifdef WIN32

 #include <winsock2.h>
 #include <errno.h>

#undef EADDRNOTAVAIL
 #define EADDRNOTAVAIL WSAEADDRNOTAVAIL
...

В программировании я сам новичок но надеюсь кому-нибудь поможет эта информация! :slight_smile:

ps: кстате никто не знает что за варнинг, и как его поправить?

	// get length of file

	IS.seekg( 0, ios :: end );
	uint64_t FileLength = IS.tellg( );
	// up to 64 fix ?
	// uint32_t FileLength = IS.tellg( );

	if( start > FileLength )
	{
		IS.close( );
		return string( );
	}

	IS.seekg( start, ios :: beg );

	// read data

	char *Buffer = new char[length];
	IS.read( Buffer, length );
	string BufferString = string( Buffer, IS.gcount( ) );
	IS.close( );
	delete [] Buffer;
	return BufferString;
}

warning C4244: ‘argument’ : conversion from ‘std::streamsize’ to ‘unsigned int’, possible loss of data
Ругается на строку:

string BufferString = string( Buffer, IS.gcount( ) );

Конструктор класса string, из примера выше, имеет следующий прототип:

Второй параметр size_t является безнаковым типом (unsigned int), ты же передаешь ему переменную типа streamsize (возвращаемую методом gcount() ), которая является знаковой. В варнинге говорится, что при приведении типа (streamsize к unsigned int) возможно потеря некоторой информации, в нашем случае “знака”.

ааа ну тогда варнинг не очень опасный :slight_smile:

boost использует своё одноимённое пространство имён, такие совпадения конкретно с ним исключены. Делай так.

Хм,

	char *Buffer = new char[length];
	IS.read( Buffer, length );
//	string BufferString = string( Buffer, IS.gcount( ) );
	string BufferString = string( Buffer, (DWORD) IS.gcount( ) );
	IS.close( );
	delete [] Buffer;
	return BufferString;

Ругается:
error C2065: ‘DWORD’ : undeclared identifier
error C2146: syntax error : missing ‘)’ before identifier ‘IS’
error C2059: syntax error : ‘)’

Бусты юзаю февральские, 1.49

#include <windows.h>

спасибо, варнинг больше не беспокоит :slight_smile: