2021-05-01, 07:11 PM
2021-05-01: y_unique
Most people know about y_hooks, and that if you use it in multiple files you need to include it in every one.? But why?? The reason is that every time you include it, it generates a new unique name for the hooked functions so that two hook OnPlayerConnects in a row don?t have the same name for the compiler.? But how?? y_unique
Including y_hooks after the first time just in turn includes y_unique.? This library exports two symbols - UNIQUE_SYMBOL and UNIQUE_FUNCTION.
That will print two numbers (probably sequential, but that?s not a guarantee).
That will make two functions with names such as My008thFunction and My009thFunction.? The zeros are by design, and the numbers are injected in to the symbol in place of the given ...s.? The <Function...Name> pattern is used in a few other places in YSI as well, most notably y_groups.? If you?re wondering why it is done this way, the following code won?t work:
That will just produce two functions both called exactly MyUNIQUE_SYMBOLthFunction, and the following code is a syntax error:
In C this could be done with the ## operator, but while there are proposals to add it to pawn, they haven?t materialised yet.
How does y_unique generate a new number every time you include it? It?s just a massive massive string of #if UNIQUE_SYMBOL == 4s etc. Its split up in to files by 100s, and within those in to groups of 10 for speed, but there?s really nothing more to it than that. This also means the numbers are limited to as high as the defines go (currently 999).
Most people know about y_hooks, and that if you use it in multiple files you need to include it in every one.? But why?? The reason is that every time you include it, it generates a new unique name for the hooked functions so that two hook OnPlayerConnects in a row don?t have the same name for the compiler.? But how?? y_unique
Including y_hooks after the first time just in turn includes y_unique.? This library exports two symbols - UNIQUE_SYMBOL and UNIQUE_FUNCTION.
- UNIQUE_SYMBOL is just a number:
Quote:
#include <YSI_Coding\y_unique>
printf("Value: %d", UNIQUE_SYMBOL);
#include <YSI_Coding\y_unique>
printf("Value: %d", UNIQUE_SYMBOL);
That will print two numbers (probably sequential, but that?s not a guarantee).
- UNIQUE_FUNCTION is a macro that takes a symbol name and injects a number in to it:
Quote:
#include <YSI_Coding\y_unique>
UNIQUE_FUNCTION<My...thFunction>()
{
}
#include <YSI_Coding\y_unique>
UNIQUE_FUNCTION<My...thFunction>()
{
}
That will make two functions with names such as My008thFunction and My009thFunction.? The zeros are by design, and the numbers are injected in to the symbol in place of the given ...s.? The <Function...Name> pattern is used in a few other places in YSI as well, most notably y_groups.? If you?re wondering why it is done this way, the following code won?t work:
Quote:
#include <YSI_Coding\y_unique>
MyUNIQUE_SYMBOLthFunction()
{
}
#include <YSI_Coding\y_unique>
MyUNIQUE_SYMBOLthFunction()
{
}
That will just produce two functions both called exactly MyUNIQUE_SYMBOLthFunction, and the following code is a syntax error:
Quote:
#include <YSI_Coding\y_unique>
My UNIQUE_SYMBOL thFunction()
{
}
#include <YSI_Coding\y_unique>
My UNIQUE_SYMBOL thFunction()
{
}
In C this could be done with the ## operator, but while there are proposals to add it to pawn, they haven?t materialised yet.
How does y_unique generate a new number every time you include it? It?s just a massive massive string of #if UNIQUE_SYMBOL == 4s etc. Its split up in to files by 100s, and within those in to groups of 10 for speed, but there?s really nothing more to it than that. This also means the numbers are limited to as high as the defines go (currently 999).