Detectando tempo de compilação da arquitetura da CPU

Qual é a maneira mais confiável de descobrir a arquitetura da CPU ao compilar o código C ou C ++? Tanto quanto eu posso dizer, diferentes compiladores têm seu próprio conjunto de definições de pré-processadores não-padrão (_M_X86 em MSVS,__i386__, __arm__ no GCC, etc).

Tem algumapadrão maneira de detectar a arquitetura que estou construindo? Se não, existe uma fonte para uma lista abrangente de tais definições para vários compiladores, como um cabeçalho com todo o clichê?#ifdefs?