Я думаю многим известнен макрос, понимаемый многими asm-компиляторами calchash macro procname hash = 0 irpc c, <procname> hash = ((hash shl 15) and 0FFFFFFFFh) or (hash shr (32-15)) hash = hash xor "&c" endm endm Возможно ли сделать подобный макрос для с-компиляторов, дял того что-бы строка не была в секции данных
1) либо написать стандартный макрос на ANSI C; 2) либо использовать Boost.Preprocessor (у меня не получилось перевести макрос "один в один", подозреваю что с этими макросами можно так сделать) 3) написать какой-нибудь скрипт на perl'e/python'e/what else, к-рый будет в pre-build'e находить все строки и "превращять" их в хеши.
По мне так скрипт на актив перле и есть выход. Просто думал это просто "либо написать стандартный макрос на ANSI C", хотя для мена не просто такой макрос сделать, без добавления в секцию данных самой строки непосредсвенно.
Может и пора, но реально не выходит, без добавления некого кода или самой строки в секцию данных, я не знаю таких механизмов препроцессора с/c++ равнозначных препроцессору masm hash = 0 irpc c, <procname> hash = ((hash shl 15) and 0FFFFFFFFh) or (hash shr (32-15)) hash = hash xor "&c" endm endm Так что если знаете, дорогой censored уж подскажите.
Код (Text): #include <stdio.h> #include <stdlib.h> #define MY_GET_NAME1(a) ((((#@a)<<15) & 0xffffffff) | (#@a>>(32-15))) #define MY_GET_NAME2(a,b) MY_GET_NAME1(a) ^ MY_GET_NAME1(b) #define MY_GET_NAME3(a,b,c) MY_GET_NAME2(a,b) ^ MY_GET_NAME1(c) ... #define MY_GET_NAME33(a,b,c,d,...) unsigned long calchash(const char *string) { unsigned long hash = 0; size_t i, len = strlen(string); for (i = 0; i < len; ++i) { hash ^= ((string[i] << 15) & 0xffffffff) | (string[i] >> (32 - 15)); } return hash; } void main() { unsigned long h1; unsigned long h2; h1 = MY_GET_NAME3(a,b,c); h2 = calchash("abc"); printf("h1 = %p\nh2 = %p\n", h1, h2); } Хэш плохой, но это просто пример.