Другие языки программирования и технологии

C++ помогите пож.

Как правильно объявлять директиву #define? Объявляю до/после всех #include - компилятор ругается, может define находится в специальной библиотеке?
#ifndef blahblah
#define blahblah 1
#endif
РR
Роман Rem
3 129
Лучший ответ
Сергей Зацепин спасибо, оказывается, я после #define ставил точку с запятой, вот и всё
Azyz Sungatov Так объявляют заголовки на одинарное подключение типа если не было объявлено, то подключить!
Как думаешь, тут есть телепаты? Если нет, то как думаешь - мы без твоего кода и текста сообщения компилятора сможем догадаться, что именно ты не так делаешь?

И нет, директивы препроцессора - не библиотечные объявления, а структуры языка, причем исполняющиеся раньше всех других.
Жээнбек Иманов
Жээнбек Иманов
70 570
#define это определение макроса

есть предопределенные макросы типа __DATE__ __FILE__ __LINE__ __TIME__

файлы проектов в могут определять ещё макросы, например в Visual Studio - параметры проекта - C/C++ -препроцессор - Preprocessor Definition

если режим Debug то там написано _DEBUG, если Release то NDEBUG

для чего это нужно
например, в режиме отладки можно выводить информацию

#ifdef _DEBUG
cout << "ERROR in " << __FILE__ << " line " << __LINE__ << endl;
#endif
когда будет строится release версия то этот код проигнорируется

#if defined(__linux__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD_kernel__) || defined(__GNU__)
//тут инклуды линуксоидов
#elif defined(__APPLE__)
//тут инклуды эйпел
#elif defined(WIN32) || defined(_MSC_VER)
//тут инклуды видовза
#else
дальше общий код

Например, чтото тестируешь. И, можно участок кода включать и выключать, либо отключить и оставить на потом или как демонстрацию для других

//#define MY_TEST //задокументировали, значит теста не будет
#ifdef MY_TEST
//код
#endif

часто define используют для создания констант.
#define PI 3.14159265358979323846f
cout << "sin 45 = " << sin(45)/180.f*PI << endl;

просто в место PI подставляется значение

так же можно сделать так

#ifdef WIN32
#define s32 _int32
#else
#define s32 signed int
#endif

тип _int32 доступен только для Windows, по этому есть else
хотя для таких случаев лучше использовать

typedef signed int s32;
или
using s32 = signed int;

можно делать макросы-функции

#define cube(x) (x*x*x)
cout << "5 в кубе = " << cube(5) << endl;
#define max(a,b) (((a) > (b)) ? (a) : (b))
#define min(a,b) (((a) < (b)) ? (a) : (b))
получается это ВСТРАИВАЕМЫЕ функции.

если пишешь большой макрос то можно переходить на следующие строчки символом \

bool init_some_system( void ) { return init_core() ? true : false; }
#define INIT(x, str) { bool res = (x); \
if(!res){ std::string s = str;\
s+= "\nLine: ";\
s += __LINE__;\
MessageBoxA(0, s.c_str(), "Error", MB_OK);}}

INIT(init_some_system, "Ошибка инициализации");
Объявляй там, где он тебе нужен.
Пример:

#define EType_1 int
void foo(){
EType_1 N = 100;
#define EType_2 float
EType_2 a = 0.5;
#undef EType_2
}