Les #define dans Pawn sont très utiles. Il est difficile d'expliquer tout ce qui est possible de faire avec, mais je vais essayer.
Avec, il est possible de faire des options de compilation, ou bien des fonctions qui ne peuvent pas être scriptées 'normalement', mais l'usage le plus courant est la simple substitution de texte, ce qui permet de ne pas avoir à modifier dans tout le script une certaine valeur.
Les #define ne sont pas compilées. Ce sont des directives du précompilateur (appellé aussi préprocesseur).
Un exemple de substitution:
#define MESSAGE_TEST "Test un deux un deux"
public OnPlayerConnect(playerid)
{
SendClientMessage(playerid, 0xFFFFFFFF, MESSAGE_TEST);
return false;
}
public OnPlayerSpawn(playerid)
{
SendClientMessage(playerid, 0xFFFFFFFF, MESSAGE_TEST);
return false;
}
Au moment de la précompilation, ce script va se transformer en:
public OnPlayerConnect(playerid)
{
SendClientMessage(playerid, 0xFFFFFFFF, "Test un deux un deux");
return false;
}
public OnPlayerSpawn(playerid)
{
SendClientMessage(playerid, 0xFFFFFFFF, "Test un deux un deux");
return false;
}
C'est très utile si tu utilise plusieurs fois le même message dans ton script. Si tu veux changer le message, tu n'as qu'a changer la #define, au lieu de changer partout dans le script.
Un exemple d'option de compilation:
//#define OPTION
public OnFilterScriptInit()
{
#if defined OPTION
print("OPTION est défini, ce message va donc apparaitre dans la console");
#endif
}
Si tu teste ce script, tu verra que le message n'apparait pas dans la console. Pour qu'il apparaisse, tu devra enlever les // devant la #define.
Maintenant un exemple de fonction qu'il est trèèès compliqué de reproduire avec du code normal:
new g_message[128];
#define SendClientMessageEx(%1,%2,%3) \
{\
format(g_message,sizeof g_message,%3);\
SendClientMessage(%1,%2,g_message);\
}
Les '\' signifient que la define continue sur la ligne suivante.
Maintenant, tu peut l'utiliser comme ceci:
SendClientMessageEx(playerid, 0xFFFFFFFF, "Tu roule à %d km/h et tu as %d €", Vitesse[playerid], Monnaie[playerid]);