2014-09-25 7 views
1

У меня есть код, как-Wpedantic неверного типа аргумента для увеличения после литья

while (n--) 
{ 
    *((char*)dest++) = *((char*)src++); 
} 

где dest и src являются недействительными указателями и n размера. Целью является повторная реализация функции memcpy. При компиляции этого кода с gcc все работает отлично, но когда я добавляю флаг -Wpedantic, у меня есть четыре предупреждения «неправильный аргумент типа для увеличения».

Google сообщает мне, что это происходит при попытке использовать арифметику на указателях void, поскольку gcc рассматривает тип void как 1-байтовый тип в этом случае, но устаревшие компиляторы shoud not. Затем мне нужно наложить указатель на указатель на char, но, как вы видите, я уже сделал это!

Любая идея?

+1

'* (((длинный *) Dest) ++) = * (((длинный *) ЦСИ) ++); ' – mch

+0

Я тоже об этом подумал, но тогда у меня есть ошибка« lvalue, требуемая как операнд приращения » –

+0

, вы можете делать прирост отдельно:' dest = (long *) dest + 1; ' – mch

ответ

3

Casting (аннулируются) dest и src к unsigned char *перед тем вы используете их дает чистый код (по стоимости двух переменных указателей на стеке).

unsigned char * dest_p = (unsigned char *)dest; 
unsigned char * src_p = (unsigned char *)src; 

while (n--) 
{ 
    *dest_p++ = *source_p++; 
} 

(Почему unsigned? Потому что это как стандарт явно определяет его. ;-))

+0

Да, вы право, на самом деле я скопировал только часть кода, где я проверяю, что данные, которые мне нужно скопировать, выравниваются по словам, если я не использую тип char. Я исправлю это сейчас в сообщении. –

+0

Просто любопытно, любая идея о том, почему мой код не работает? –

+1

++ имеет более высокий приоритет, чем приведение, поэтому приращение переходит к указателю void, который недопустим. – mch