C / C ++, 306295 bytes
#define C(c)((c)>>1^((c)&1?0xEDB88320L:0))
#define K(c)(C(C(C(C(C(C(C(C(c))))))))),
#define F(h,l)K((h)|(l+0))K((h)|(l+1))K((h)|(l+2))K((h)|(l+3))
#define R(h)F(h<<4,0)F(h<<4,4)F(h<<4,8)F(h<<4,12)
unsigned long crc_table[]={R(0)R(1)R(2)R(3)R(4)R(5)R(6)R(7)R(8)R(9)R(10)R(11)R(12)R(13)R(14)R(15)};
Trabalhando ao contrário, terminamos com uma matriz longa não assinada chamada crc_table. Podemos omitir o tamanho da matriz, pois as macros garantirão que haja exatamente 256 elementos na matriz. Inicializamos a matriz com 16 'linhas' de dados usando 16 invocações da macro R.
Cada chamada de R se expande em quatro fragmentos (macro F) de quatro constantes (macro K) para um total de 16 'colunas' de dados.
A macro K é o loop desenrolado indexado por k no código da pergunta original. Ele atualiza o valor c oito vezes chamando a macro C.
Essa solução baseada em pré-processador usa bastante memória durante a expansão da macro. Tentei torná-lo um pouco mais curto com um nível extra de expansão de macro e meu compilador vomitou. O código acima é compilado (lentamente) com o Visual C ++ 2012 e o g ++ 4.5.3 no Cygwin (Windows 7 de 64 bits e 8 GB de RAM).
Editar:
O fragmento acima tem 295 bytes, incluindo espaço em branco. Depois de expandir todas as macros, exceto C, ele cresce para 9.918 bytes. À medida que cada nível de macro C é expandido, o tamanho aumenta rapidamente:
- 25.182
- 54.174
- 109.086
- 212.766
- 407.838
- 773.406
- 1.455.390
- 2.721.054
Assim, quando todas as macros foram expandidas, esse pequeno arquivo de 295 bytes se expande para mais de 2,7 megabytes de código que devem ser compilados para gerar a matriz original de 1024 bytes (assumindo valores longos não assinados de 32 bits)!
Outra edição:
Modifiquei a macro C com base em uma macro de outra resposta para extrair 11 bytes extras e reduzi bastante o tamanho total da macro expandida. Embora 2,7 MB não sejam tão ruins quanto 54 MB (o tamanho final anterior de toda a expansão de macros), ainda é significativo.