Объясните использование

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
PHP:
#define _DMGP 1
#define _DMGS 1
#define _HPLEFT 1
#define _UpdRadarBlock 1
#define _RateCheck 0
#define _GameDesc "Sky-Play CSS:DM"
#define _HostagesGod 0


#if defined _GameDesc
#include <sdkhooks>
#endif

#if _DMGS
#include <sdktools_sound>
#include <sdktools_stringtables>
#endif

#if _HostagesGod
#include <sdktools_functions>
#endif
Потом например такое:
PHP:
#if defined _GameDesc
public Action:OnGetGameDescription(String:gameDesc[64]) 
{
	strcopy(gameDesc, sizeof(gameDesc), _GameDesc);
	return Plugin_Changed; 
}
#endif
#if _DMGS || _DMGP
public EventOnPlayerHurt(Handle:event, const String:name[], bool:dontBroadcast) 
{
	new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
	if(attacker > 0 && (GetClientOfUserId(GetEventInt(event, "userid")) != attacker))
	{
		#if _DMGS
		EmitSoundToClient(attacker, SOUNDPATH,SOUND_FROM_PLAYER,SNDCHAN_AUTO,SNDLEVEL_NORMAL,SND_NOFLAGS,VOLUME);
		#endif
		#if _DMGP
		PrintCenterText(attacker, "-%d HP", GetEventInt(event, "dmg_health"));
		#endif
	}
}
#endif
Короче это указания компилятору, что компилировать, а что нет. Если в начале кода сделать например _DMGS 0, то в функции EventOnPlayerHurt не будет строчки EmitSoundToClient, а если еще и _DMGP в 0 поставить, то вообще вся эта функция в результирующий плагин не включится.

#if defined *** - код между ним и #endif включится в плагин, если до этого был дефайн, не важно с каким содержимым.

Ну и еще #else есть...
 

Серый™

CS:S Server
Сообщения
2,925
Реакции
1,376
#define - квар и его значение. Пример..
PHP:
#define _DEBUG 0
#if ,#endif - отдельный участок кода который будет работать или нет, от квара. Пример..
PHP:
#if _DEBUG
	LogDebug(false, "BuildLogFilePath - AFK Log File: %s", AFKM_LogFile);
#endif
и вот ещё.
#include - подключение дополнительного файла инклуде.
#pragma - программа и его значение

Вроде так :-D

KorDen, чуть меня опередил))
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #4
Тоесть это не условия плагина, а условия для компиляции ?

И вот если объявлено
#define _DEBUG
это автоматически присваивает ему 1 ?

Если #define _DEBUG не будет, а #if _DEBUG - то приймет как 0 ?
 

Серый™

CS:S Server
Сообщения
2,925
Реакции
1,376
R1KO, думаю будет ошибка если не объявишь #define _DEBUG
 

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
Тоесть это не условия плагина, а условия для компиляции ?

И вот если объявлено
#define _DEBUG
это автоматически присваивает ему 1 ?

Если #define _DEBUG не будет, а #if _DEBUG - то приймет как 0 ?

Если просто объявлено #define _DEBUG - неизвестно как себя поведет условие #if _DEBUG
Если именно идет #if DEBUG то объявлять надо #define DEBUG 1 (ну или 0 дял отключения). Можно и всякие #if DEBUG==1 вроде использовать...

Для того, чтобы просто проверялось, было ли объявление (но не значение этого объявления), надо писать #if defined DEBUG
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #7
KorDen, сколько исходников смотрел, много где #define _DEBUG и #if _DEBUG
 

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
Хм...
Pawn Language Guide написал(а):
#if constant expression, #elseif, #else, #endif
Portions of a program may be parsed or be ignored depending on certain conditions. The pawn parser (compiler or interpreter) generates code only for those portions for which the condition is true.
The directive #if must be followed by a constant expression. To check whether a variable or constant is defined, use the defined operator.

Zero or more #elseif directives may follow the initial #if directive. These blocks are skipped if any of the preceding #if or #elseif blocks were parsed (i.e. not skipped). As with the #if directive, a constant expression must follow the #elseif expression. The #else causes the parser to skip all lines up to #endif if the preceding #if or any of the preceding #elseif directives were “true”, and the parses these lines if all preceding blocks were skipped. The #else directive may be omitted; if present, there may be only be one #else associated with each #if.
The #endif directive terminates a program portion that is parsed conditionally. Conditional directives can be nested and each #if directive must be ended by an #endif directive.
 
  • Мне нравится
Реакции: R1KO

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #9
KorDen, ну должна, так должна))
P.S. Не дашь ссылочку ? :)
Всем спасибо !
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #10
чтобы не создавать новую тему, тут спрошу. В чем отличие между decl и new ?
 

wanted241

Real-Gamer.Ru
Сообщения
428
Реакции
161
decl - Содержит в себе мусор и предназначена для использования в нагруженных переменных с большим массивом. (т.е. тех, что часто используются)
 
  • Мне нравится
Реакции: R1KO

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
Если есть знание английского базовое - вот более полное описание - http://wiki.alliedmods.net/Introduction_to_SourcePawn#Extended_Variable_Declarations

Собственно полезно для строк, однако не работает на глобальном уровне, и для переменных (не массивов) не имеет смысла. Однако такая строка не экранируется, если в нее сразу не записывается что-либо, лучше бы сделать name[0]='\0'; для исключения ошибок

Добавлено через 11 часов 26 минут
P.S. Не дашь ссылочку ? :)

Только заметил... http://www.compuphase.com/pawn/Pawn_Language_Guide.pdf - не все актуально для SourcePawn, но основы одни
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
#include - подключение дополнительного файла инклуде.
Грамотно будет так:
PHP:
			#include
Подключаемая библиотека SourceMod API или другой исходный файл - файл включения. Заключается в двойные кавычки или в <>.
			#include <sourcemod>
Включение списков файлов всех структур, функций, вызовов и тегов, которые имеются в наличии.
Может, ещё кто читать будет - пригодится.
 
Последнее редактирование:

semjef

semjef.ru
Сообщения
993
Реакции
444
AlmazON, ты написал для #include <sourcemod>.

а так инклуд используется для подключения дополнительных файлов.

Директива #include предлагает компилятору включить другой исходный файл, имя которого ука­зывается после директивы. Имя файла заключается в двойные кавычки или в <>. Например, сле­дующие две директивы указывают компилятору на необходимость подключить заголовочный файл стандартной библиотеки ввода/вывода:

#include "stdio.h"
#include <stdio.h>
http://www.c-cpp.ru/books/include
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
ты написал для #include <sourcemod>
Нет. Если взглянуть на страницу доков, то даже в ней указано, что это API для всех SM. К тому же, они действительно вызываются отдельно из того же SM (например, #include <cstrike>). Разве скобки убрать, (или файлы включения).
А вот второе предложение может не так справедливо. В общем, поправил.
Оффтоп
 
Последнее редактирование:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #16
AlmazON, а ничего что павн это тот же c++ только упрощенный?
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #18
AlmazON, но по сути то это язык программирования, хоть и в узкой области, а следовательно к нему можно применять некоторые термины из других ЯП.
 

semjef

semjef.ru
Сообщения
993
Реакции
444
AlmazON, pawn сам написан на C++. термины применимы.
 
Сверху Снизу