Ну, если вы сами выводите сообщение пользователю (в отличие от того, чтобы система отображала адрес сбоя или функцию), ничто не мешает вам отображать именно то, что вы хотите.
Например:
typedef union ErrorCode {
struct {
unsigned int file: 15;
unsigned int line: 12; /* Better than 5 bits, still not great
Thanks commenters!! */
unsigned int build: 5;
} bits;
unsigned int code;
} ErrorCode;
unsigned int buildErrorCodes(const char *file, int line, int build)
{
ErrorCode code;
code.bits.line=line & ((1<<12) - 1);
code.bits.build=build & ((1<< 5) - 1);
code.bits.file=some_hash_function(file) & ((1<<15) - 1);
return code.code;
}
Вы бы использовали это как
buildErrorCodes(__FILE__, __LINE__, BUILD_CODE)
и выведите его в шестнадцатеричном виде. Не было бы очень трудно расшифровать ...
(Отредактировано - комментаторы верны, я, должно быть, сошел с ума, чтобы указать 5 бит для номера строки. Однако по модулю 4096 строки с сообщениями об ошибках вряд ли будут конфликтовать. 5 бит для сборки все еще в порядке - Модуль 32 означает, что только 32 сборки могут быть выдающимися, и ошибка все равно будет возникать в одной строке.)