Я применил следующую конструкцию кода в нашей производственной среде (в значительной степени упрощенной).Странное использование static_cast
#include <iostream>
typedef struct
{
char entry[10];
}
inn_struct;
typedef struct
{
inn_struct directory;
}
out_struct;
struct test
{
static const int
ENTRY_LENGTH = (sizeof((static_cast<out_struct*>(0))->directory.entry)
/sizeof((static_cast<out_struct*>(0))->directory.entry[0]));
};
int main()
{
test a;
std::cout << test::ENTRY_LENGTH;
}
Теперь не считая, очевидно, обфусцированный характер его, так как это просто старый C способ определения длины массива ... Я действительно беспокоил static_cast
значения 0
. ... Является ли этот код приемлемым? Можете ли вы приложить некоторые отрывки из стандарта C++ к вашему ответу, который говорит мне (если), почему этот код в порядке?
Два примечания относительно лучшей формы (X :: entry): 1. Он работает в Clang и GCC, но не работает в Visual C++ 2013. 2. Лучшая цитата для него - это конец [5.1.1], где также есть пример. – bogdan
@bogdan добавил, что этот раздел тоже не читал этого в первый раз. Также форматирование было раздражающим: - / – Barry