Biorąc pod uwagę twój opis sytuacji, powiedziałbym, że używanie static const
członków jest dobrym podejściem. W C++ 11 możesz go zmienić na static constexpr
, aby podkreślić, że jest to stała czasu kompilacji, chociaż nic nie zmieni się w rezultacie.
Jeśli odnosić się do myclass::kMyClassContant_
gdzieś w kodzie w sposób, który jest istotny w ramach reguły jednej definicji (odr), esp. w kontekstach wymagających odniesienia (w tym const-reference) kompilator będzie narzekał, że nie ma definicji stałej. Samo zadeklarowanie i zainicjowanie go wewnątrz klasy nie jest w tym przypadku wystarczające. To może zmusić cię do oddzielnej deklaracji i definicji:
// mycode.h
class myclass {
private:
static const uint16_t kMyClassConstant_;
};
// mycode.cpp
const uint16_t myclass::kMyClassConstant_ = 0xBEEF;
Aby uniknąć kłopotów z utrzymaniem oddzielnych deklaracji i definicji, niektórzy ludzie wolą deklarowania funkcji inline constexpr zamiast zmiennej rzeczywistej:
// mycode.h
class myclass {
private:
static constexpr uint16_t kMyClassConstant_()
{ return 0xBEEF; }
};
ten to poprawne obejście wielu problemów związanych z odrami i nie powoduje żadnych strat w wydajności. To, czy jest to naprawdę użyteczne, zależy od tego, ile obciążenia stanowi utrzymanie oddzielnych deklaracji i definicji zwykłej stałej statycznej. Jeśli spodziewasz się, że twoje stałe nigdy się nie zmienią w miarę ewolucji twojego kodu, lepiej jest użyć zwykłych stałych statycznych z oddzielnymi definicjami. Ale jeśli często modyfikujesz definicje stałych, konieczność ponownego skompilowania pliku definicji i ponownego połączenia z wszystkimi istotnymi częściami projektu może sprawić, że rozwiązanie oparte na funkcjach będzie lepszym rozwiązaniem.
Ostateczny komentarz do typu danych: Wymuszenie 16 bitów przy użyciu std::uint16_t
może być przydatne, jeśli trzeba przechowywać wiele tych wartości w formie kompaktowej. W przeciwnym razie rzeczywisty rozmiar może nie mieć znaczenia, w którym to przypadku może być lepszy std::uint_fast16_t
(który może być większy niż 16 bitów).
Nie, nie ma w tym nic złego. (Mam nadzieję, że niektórzy eksperci C++ nie będą musieli mnie poprawiać :)) – xxbbcc
Możesz uzyskać lepsze odpowiedzi na http://codereview.stackexchange.com. –
Tak, jest to normalny sposób deklarowania stałej globalnej. –