Tworzenie własnych flag
Ostatnio zmodyfikowano 2019-08-04 17:54
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 namespace ms { 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' ) { 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 ) ); } } }
|
|
pekfos |
» 2019-08-04 16:15:55 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. |
|
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. #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; }
|
|
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. |
|
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ć :) |
|
« 1 » |