Может ли этот макрос быть преобразован в функцию? - PullRequest
8 голосов
/ 18 сентября 2008

Проводя рефакторинг кода и избавляя себя от всех тех #defines, которые нас теперь учат ненавидеть, я столкнулся с этой красотой, используемой для вычисления количества элементов в структуре:

#define STRUCTSIZE(s) (sizeof(s) / sizeof(*s))

Очень полезно, как есть, но может ли оно быть преобразовано во встроенную функцию или шаблон?

Хорошо, ARRAYSIZE было бы лучшим именем, но это устаревший код (не знаю, откуда он взялся, ему по крайней мере 15 лет), поэтому я вставил его "как есть".

Ответы [ 16 ]

0 голосов
/ 19 сентября 2008

Для Windows:

Существует макрос _countof(), предоставляемый ЭЛТ именно для этой цели.

Ссылка на документ на MSDN

0 голосов
/ 18 сентября 2008
0 голосов
/ 18 сентября 2008

Как ответ JohnMcG, но

Недостатком является то, что у вас будет копия этого в двоичном файле для каждой комбинации Typename, Size.

Вот почему вы сделали бы это встроенной шаблонной функцией.

0 голосов
/ 18 сентября 2008

У xtofl есть правильный ответ для определения размера массива. Для определения размера структуры не требуется макрос или шаблон, так как sizeof () должен работать хорошо.

Я согласен, что препроцессор является злом , но бывают случаи, когда он является наименьшим злом из альтернатив .

0 голосов
/ 18 сентября 2008

Я не думаю, что это действительно помогает определить количество элементов в структуре. Если структура упакована, и вы использовали вещи, размер которых меньше размера указателя (например, char в 32-битной системе), тогда ваши результаты неверны. Кроме того, если структура содержит структуру, вы тоже ошибаетесь!

0 голосов
/ 18 сентября 2008

Да, это может быть сделано шаблон в C ++

template <typename T>
size_t getTypeSize()
{
   return sizeof(T)/sizeof(*T);
}

использовать:

struct JibbaJabba
{
   int int1;
   float f;
};

int main()
{
    cout << "sizeof JibbaJabba is " << getTypeSize<JibbaJabba>() << std::endl;
    return 0;
}

См. Пост BCS выше или ниже о классном способе сделать это с классом во время компиляции, используя некоторое легкое метапрограммирование шаблона.

...