вторник, 19 марта 2024 г.

[prog.c++.kill'em-all] Еще пример C++ного кода от которого у меня изрядно подгорает

Вот не нужно писать кроссплатформенный код вот так:

enum class status { not_started, started, shutting_down, stopped };

#if defined(PLATFORM_WINDOWS)
[[nodiscard]] const wchar_t * to_str(status st) noexcept {
  switch(st) {
    case status::not_started: return L"not_started";
    case status::started: return L"started";
    case status::shutting_down: return L"shutting_down";
    case status::stopped: return L"stopped";
  }
}
#else
[[nodiscard]] const char * to_str(status st) noexcept {
  switch(st) {
    case status::not_started: return "not_started";
    case status::started: return "started";
    case status::shutting_down: return "shutting_down";
    case status::stopped: return "stopped";
  }
}
#endif

вот не надо, пожалуйста.

Прямой путь к излишнему траху когда в одном месте что-то поправили, а на другой платформе толком не протестировали. И вопрос не в том, наступите ли вы на эти грабли или нет. Наступите. Проверенно неоднократно. Так что вопрос лишь в том когда именно наступите.

Сделайте хотя бы так:

// Эта кухня должна жить в отдельном заголовочном файле.
#if defined(PLATFORM_WINDOWS)
  using platform_char_type = wchar_t;
  #define STRING_LITERAL(str) L##str
#else
  using platform_char_type = char;
  #define STRING_LITERAL(str) str
#endif

enum class status { not_started, started, shutting_down, stopped };

[[nodiscard]] const platform_char_type * to_str(status st) noexcept {
  switch(st) {
    case status::not_started: return STRING_LITERAL("not_started");
    case status::started: return STRING_LITERAL("started");
    case status::shutting_down: return STRING_LITERAL("shutting_down");
    case status::stopped: return STRING_LITERAL("stopped");
  }
}

Комментариев нет:

Отправить комментарий