De acordo com o padrão C11, capítulo §5.1.1.2, concatenação de literais de string adjacentes:
Os tokens literais de string adjacentes são concatenados.
acontece na fase de tradução . Por outro lado:
printf("Hi" (test ? "Bye" : "Goodbye"));
envolve o operador condicional, que é avaliado em tempo de execução . Portanto, em tempo de compilação, durante a fase de tradução, não há literais de string adjacentes presentes, portanto, a concatenação não é possível. A sintaxe é inválida e, portanto, relatada por seu compilador.
Para elaborar um pouco sobre a parte porque , durante a fase de pré-processamento, os literais de string adjacentes são concatenados e representados como um único literal de string (token). O armazenamento é alocado de acordo e o literal de string concatenado é considerado como uma entidade única (um literal de string).
Por outro lado, no caso de concatenação em tempo de execução, o destino deve ter memória suficiente para conter o literal de string concatenado , caso contrário, não haverá nenhuma maneira de acessar a saída concatenada esperada . Agora, no caso de strings literais , eles já estão alocados de memória em tempo de compilação e não pode ser estendido para caber em qualquer entrada de mais de entrada em ou anexado ao conteúdo original. Em outras palavras, não haverá como o resultado concatenado ser acessado (apresentado) como um único literal de string . Portanto, essa construção é inerentemente incorreta.
Apenas para sua informação, para concatenação de string em tempo de execução ( não literais ), temos a função de biblioteca strcat()
que concatena duas strings . Observe, a descrição menciona:
char *strcat(char * restrict s1,const char * restrict s2);
A strcat()
função anexa uma cópia da string apontada por s2
(incluindo o caractere nulo de terminação) ao final da string apontada pors1
. O caractere inicial de s2
substitui o caractere nulo no final de s1
. [...]
Portanto, podemos ver que s1
é uma string , não uma string literal . No entanto, como o conteúdo de s2
não é alterado de forma alguma, pode muito bem ser um literal de string .