Размер «трюка» - лучший способ, который я знаю, с одним небольшим, но (для меня это крупная любимая мозоль) важным изменением в использовании скобок.
Как видно из записи в Википедии, C * sizeof
не является функцией; это оператор . Таким образом, он не требует скобок вокруг своего аргумента, если аргумент не является именем типа. Это легко запомнить, поскольку аргумент выглядит как приведенное выражение, которое также использует круглые скобки.
Итак: если у вас есть следующее:
int myArray[10];
Количество элементов с кодом можно найти следующим образом:
size_t n = sizeof myArray / sizeof *myArray;
Это, для меня, читается намного проще, чем альтернатива с круглыми скобками. Я также предпочитаю использовать звездочку в правой части раздела, поскольку она более краткая, чем индексирование.
Конечно, это также время компиляции, поэтому нет необходимости беспокоиться о разделении, влияющем на производительность программы. Поэтому используйте эту форму везде, где сможете.
Всегда лучше использовать sizeof для реального объекта, когда он у вас есть, а не для типа, поскольку тогда вам не нужно беспокоиться о том, чтобы сделать ошибку и указать неверный тип.
Например, скажем, у вас есть функция, которая выводит некоторые данные в виде потока байтов, например, по сети. Давайте вызовем функцию send()
и заставим ее принимать в качестве аргументов указатель на объект для отправки и количество байтов в объекте. Итак, прототип становится:
void send(const void *object, size_t size);
А затем вам нужно отправить целое число, чтобы вы кодировали его следующим образом:
int foo = 4711;
send(&foo, sizeof (int));
Теперь вы ввели тонкий способ выстрелить себе в ногу, указав тип foo
в двух местах. Если одно меняется, а другое нет, код ломается. Таким образом, всегда делайте это так:
send(&foo, sizeof foo);
Теперь вы защищены. Конечно, вы дублируете имя переменной, но вероятность того, что компилятор может обнаружить ее, если вы ее измените, высока.