The following code compiles without problems:
int main() {
printf("Hi" "Bye");
}
However, this does not compile:
int main() {
int test = 0;
printf("Hi" (test ? "Bye" : "Goodbye"));
}
What is the reason for that?
According to the C Standard (5.1.1.2 Translation phases)
1 The precedence among the syntax rules of translation is specified by the following phases.6)
- Adjacent string literal tokens are concatenated.
And only after that
- White-space characters separating tokens are no longer significant. Each preprocessing token is converted into a token. The resulting tokens are syntactically and semantically analyzed and translated as a translation unit.
In this construction
"Hi" (test ? "Bye" : "Goodbye")
there are no adjacent string literal tokens. So this construction is invalid.