Vários caracteres em uma constante de caractere

Alguns compiladores C permitem vários caracteres em uma constante de caractere. Isso significa que escrever “sim” em vez de “sim” pode passar desapercebido. Fonte: armadilhas C e armadilhas

Alguém pode dar um exemplo disso, onde vários caracteres são permitidos em uma constante de caractere?

Como Code Monkey citou, é implementação definida e implementação varia – não é apenas uma diferença BigEndian / LittleEndian e charset. Eu testei quatro implementações (todas usando ASCII) com o programa

#include  int main() { unsigned value = 'ABCD'; char* ptr = (char*)&value; printf("'ABCD' = %02x%02x%02x%02x = %08x\n", ptr[0], ptr[1], ptr[2], ptr[3], value); value = 'ABC'; printf("'ABC' = %02x%02x%02x%02x = %08x\n", ptr[0], ptr[1], ptr[2], ptr[3], value); return 0; } 

e eu tenho quatro resultados diferentes

Big endian (AIX, POWER, compilador da IBM)

 'ABCD' = 41424344 = 41424344 'ABC' = 00414243 = 00414243 

Big endian (compilador Solaris, Sparc, SUN)

 'ABCD' = 44434241 = 44434241 'ABC' = 00434241 = 00434241 

Little endian (Linux, x86_64, gcc)

 'ABCD' = 44434241 = 41424344 'ABC' = 43424100 = 00414243 

Little endian (Solaris, x86_64, compilador Sun)

 'ABCD' = 41424344 = 44434241 'ABC' = 41424300 = 00434241 

Você poderia usá-lo em uma declaração de caso, eu acho, mas eu não recomendaria isso.

'yes' é uma constante multicaracterística. Seu tipo é int e seu valor é dependente da implementação. Então, como você já disse, cabe ao compilador.

so int foo = 'yes';

ARM, seção 2.5.2, página 9:

“Uma constante de caractere é um ou mais caracteres entre aspas simples, como em ‘x’.”

Mais tarde na mesma página:

“Constantes multicharacteres possuem tipo int. O valor de uma constante multicaractere é dependente da implementação. Por exemplo, o valor de ‘AB’ pode ser razoavelmente esperado como ‘A’ ‘B’ e (‘A’ << 8) + 'B "em três implementações diferentes. Geralmente, as constantes multicaracterísticas devem ser evitadas".

e

Citando a especificação ANSI C (para a qual o C ++ faz alguma tentativa de ser compatível):

3.1.3.4 Constantes de Personagem Semântica

Uma constante charcter integer tem o tipo int [note que tem o tipo char em C ++] … O valor de uma constante de caractere inteiro contendo mais de um caractere … é definido pela implementação.

Constantes de vários caracteres são permitidas em todos os contextos em que as constantes de caractere único são permitidas.

Quanto a onde eles realmente seriam usados, vi um código que usa constantes de vários caracteres para criar valores exclusivos legíveis. Por exemplo, supondo que int seja de 4 bytes, ‘ABCD’ e ‘EFGH’ provavelmente serão distintos. (Isso não é garantido pela linguagem; a implementação deve documentar o mapeamento, mas não precisa ser razoável.) E supondo um mapeamento razoável, você provavelmente verá “ABCD” ou “EFGH” no código de object. Não é a melhor ideia do mundo, mas pode funcionar se você não se importar muito com a portabilidade.

Incidentalmente, todos os compiladores C em conformidade suportam constantes de múltiplos caracteres (por definição, um compilador que não os suporta não está em conformidade).