ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
18 июля
622198 Топик полностью
LightElf (30.09.2015 18:08, просмотров: 158) ответил SciFi на Фигасе! Заменить strlen("abc") на (sizeof "abc" - 1), и будет совсем православно.
Ура! Потестил в IAR ARM. Вот такой сорец: http://www.boost.org/doc/libs/1_59_0/libs/preprocessor/doc/index.html
#include <stdint.h> #define H1(s,i,x) (x*65599u+(uint8_t)s[(i)<(sizeof(s)-1)?(sizeof(s)-1)-1-(i):(sizeof(s)-1)]) #define H4(s,i,x) H1(s,i,H1(s,i+1,H1(s,i+2,H1(s,i+3,x)))) #define H16(s,i,x) H4(s,i,H4(s,i+4,H4(s,i+8,H4(s,i+12,x)))) #define H64(s,i,x) H16(s,i,H16(s,i+16,H16(s,i+32,H16(s,i+48,x)))) #define H256(s,i,x) H64(s,i,H64(s,i+64,H64(s,i+128,H64(s,i+192,x)))) #define HASH(s) ((uint32_t)(H256(s,0,0)^(H256(s,0,0)>>16))) int main() { return HASH("incredibly_large_string_that_gcc_groks_easily"); } Полученный листинг:
   \   00000000   0x4800             LDR.N    R0,??main_0      ;; 0xe4f58ecb
   \   00000002   0x4770             BX       LR               ;; return
   \                     ??main_0:
   \   00000004   0xE4F58ECB         DC32     0xe4f58ecb

Заодно нашел кусок препроцессорной магии из Boost (по ссылке), выглядит интересно.
Не надо делать мне как лучше, оставьте мне как хорошо