Подтвердить что ты не робот

Зачем вызывать оператор sizeof с двумя аргументами?

Недавно я натолкнулся на некоторый код, который выглядел так:

if(sizeof(var,2) == 4) { ... }

(где var - тип)

Я был очень удивлен, увидев два аргумента для оператора sizeof. Быстрое сканирование стандарта ISO/ANSI C99 не дало никаких секретов. Я не мог придумать какое-либо чтение грамматики, которая допускала бы запятую.

Поиск кода Google, я смог найти пример этого синтаксиса в некотором коде PPC.

Это какой-то специфичный для PPC синтаксис? Что это значит?

EDIT: Оказывается, что и то, на что я смотрел - так и связанный код, - это синтаксис, специфичный для Компилятор WindRiver Diab:

sizeof (тип, int-const):

Если int-const 0 sizeof возвращает размер в байтах типа.

Если int-const 1 sizeof возвращает выравнивание типа.

Если int-const 2 sizeof возвращает целочисленную константу, обозначающую тип типа. Посмотрите "оператор sizeof" в Руководство пользователя Diab C/С++ для значений.

Ничего себе, они действительно перегрузили значение оператора sizeof.

EDIT2: Полная документация находится здесь: http://www.vxdev.com/docs/vx55man/diab5.0ppc/c-additi.htm#3001432

4b9b3361

Ответ 1

В ходе дальнейших исследований я обнаружил, что это поведение, характерное для компилятора WindRiver Diab. Подробнее см. EDIT.

Ответ 3

Похож на красную селедку. Я предполагаю, что вы случайно используете оператор запятой, и sizeof применяется к последнему значению.

Ответ 4

Как уже упоминалось, применяется оператор запятой, а sizeof возвращает размер целочисленного литерала. Оффлайн это похоже на ошибку в авторской части, но может произойти зловещее кодирование.

выражения sizeof не оцениваются, поэтому их можно использовать для нескольких сложных вещей. Одним из примеров является предоставление ссылки для другой неопубликованной переменной, не приводящей компилятор к генерации какого-либо кода. См. в этой статье о создании лучшего макроса assert для примера. Alexandrescu имеет некоторые другие примеры размера trickery в Modern С++ Design, если память служит. Возможно, но маловероятно, что предполагается одно из этих неочевидных применений.

Независимо от использования, если он не комментируется в этой ситуации, тогда он явно не стоит компромиссов в удобочитаемости и должен быть изменен.

Ответ 5

Важная оговорка: ниже код - псевдокод. Аргументы для sizeof никогда не оцениваются, со значением "выполнено", он всегда является конструкцией времени компиляции (и, следовательно, один из инструментов, предпочитаемых авторами шаблонов, например перечислениями).

Заметьте, что я взял auto ниже из С++ (0x); он сообщает компилятору вывести тип из выражения инициализатора и упростить примеры

Многие не знают, что вы можете ссылаться на sizeof так:

auto s = sizeof int;

I.e., без скобок. Поэтому, если вы пройдете (x, y) до sizeof, это эквивалентно

auto c = (x,y);
auto s = sizeof c;

или просто

auto c = x,y;
auto s = sizeof c;

x,y - это последовательность, где каждая часть оценивается слева направо, а последовательность получает значение последней части, в этом случае это y. Итак, исходный код примерно эквивалентен

auto s = sizeof y;

Поэтому мне кажется, что рассматриваемый компилятор действительно делает что-то действительно, правда braindead, тем, что он вводит расширение, которое также компилируется на других компиляторах, но с совершенно другим значением. Это плохо.