Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Tworzenie własnych flag

Ostatnio zmodyfikowano 2019-08-04 17:54
Autor Wiadomość
Wuwus1
Temat założony przez niniejszego użytkownika
Tworzenie własnych flag
» 2019-08-04 15:50:49
Storzyłem plik nagółwkowy z funkcjami pomocniczymi i chciałbym ograniczyć funkcjonalność jednej z funkcji poprzez ustawienie flagi na true. Gdy ustawiam ją w funkcji (inline void ACCEPT_LOWER_TEXT_CENTERING_PRECISION(bool v_set)) to faktycznie zmienna ma wartość true, ale gdy sprawdzam jej wartość w innej funkcji to zienna ma wartość false.

Plik: functional.h
C/C++
namespace ms
{
    //Flags
    static bool TEXT_CENTERING_FLAG = false;
   
    inline void ACCEPT_LOWER_TEXT_CENTERING_PRECISION( bool v_set )
    {
        TEXT_CENTERING_FLAG = v_set;
    }
   
    namespace fn
    {
        inline const sf::Vector2f GetOriginOfOneLineText( const sf::Text & v_text )
        {
            std::string TextStr = v_text.getString();
            float MaxHeight = 0;
            for( int i = 0; i < TextStr.size(); i++ )
            {
                if( TextStr.at( i ) == '\n' )
                {
                    //ERROR HERE vvv
                    if( !TEXT_CENTERING_FLAG )
                    {
                        std::cout << "Error: Functional.h -> GetOriginOfOneLineText() could not be used because the text has a new line character.\n" <<
                        "Another text centering function has been used but it might be not super precise.\n" <<
                        "To get rid of this error use [ACCEPT_LOWER_TEXT_CENTERING_PRECISION(true)]\n";
                    }
                    return GetOriginOfMultilineText( v_text );
                }
               
                sf::Uint32 character = TextStr.at( i );
                MaxHeight = std::max( v_text.getFont()->getGlyph( character, v_text.getCharacterSize(), false ).bounds.height, MaxHeight );
            }
           
            return sf::Vector2f( v_text.getGlobalBounds().width / 2, v_text.getCharacterSize() -( MaxHeight / 2 ) );
        }
    }
}
P-174973
pekfos
» 2019-08-04 16:15:55
C/C++
static bool TEXT_CENTERING_FLAG = false;
static oznacza, że każda jednostka translacji będzie miała swoją niezależną wersję tej zmiennej globalnej. Jeśli już, powinieneś użyć extern i zdefiniować ją w pliku .cpp.
P-174974
Wuwus1
Temat założony przez niniejszego użytkownika
» 2019-08-04 16:21:11
Ale na przykład w bibliotece stb_image tak właśnie utorzono flagę. A jest to bilioteka, która ma tylko jeden plik stb_image.h i tam działa.

C/C++
#define STBIDEF static
#else
#define STBIDEF extern

...

static int stbi__vertically_flip_on_load = 0;

STBIDEF void stbi_set_flip_vertically_on_load( int flag_true_if_should_flip )
{
    stbi__vertically_flip_on_load = flag_true_if_should_flip;
}
P-174975
pekfos
» 2019-08-04 16:37:48
Ty używasz inline by móc definiować funkcje wszędzie, podczas gdy stb używa makra STB_IMAGE_IMPLEMENTATION, które musisz zdefiniować w dokładnie jednym pliku .cpp, do którego ma trafić cała implementacja. static jest tam użyte by ukryć zmienną globalną jako szczegół implementacyjny, a nie żeby móc ją zdefiniować wielokrotnie bez wywoływania błędów linkera.
P-174976
Wuwus1
Temat założony przez niniejszego użytkownika
» 2019-08-04 17:54:30
Ok rozumiem. Dzięki wielkie za pomoc muszę sobie przypomnieć jak działa extern aby to naprawić :)
P-174977
« 1 »
  Strona 1 z 1