[devel] gcc pointer arithmetics

Dmitry V. Levin ldv на altlinux.org
Вс Фев 24 19:22:44 MSK 2019


On Sun, Feb 24, 2019 at 02:06:56PM +0300, Mikhail Efremov wrote:
> On Sat, 23 Feb 2019 15:55:21 +0300 Alexey V. Vissarionov wrote:
> > On 2019-02-23 15:28:44 +0300, Leonid Krivoshein wrote:
> > 
> >  >>> void-указателями такого не проделаешь, в отличие от gcc, который
> >  >>> тоже  >>> ни один стандарт могёт.  
> >  >> Я не понял этой фразы и сравнения указателей с gcc. При чем тут
> >  >> указатель на void? Размер объекта в этом случае не известен,
> >  >> разумеется арифметика не работает.  
> > 
> > Арихметика работает независимо от. Например, конструкцию вида
> > 
> > void *x; int y = x[1];
> > 
> > компилятор пошлет по азимуту, и правильно сделает. Но при этом
> > 
> > void *x; int y = x+123;
> > 
> > не вызовет у компилятора никаких эмоций и превратится (на писюшатине)
> > в самый обычный lea. Почему? Потому что это обычное сложение, а как
> > потом будет использоваться результат - уже забота не компилятора, а
> > программиста.
> > 
> > Если что, я такие конструкции регулярно использую, когда пишу для
> > контроллеров.
> 
> Ну, я видимо не использовал, поэтому не помню, спасибо.
> Вообще логично, до того как в языке появился void * обычно использовали
> char * для этих целей.

Это gcc extension, причём довольно старый.
https://gcc.gnu.org/onlinedocs/gcc-8.3.0/gcc/Pointer-Arith.html
https://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html#SEC78


-- 
ldv
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : signature.asc
Тип     : application/pgp-signature
Размер  : 801 байтов
Описание: отсутствует
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20190224/aabd2ebe/attachment.bin>


Подробная информация о списке рассылки Devel