给出以下 C 代码:
#include <stdio.h>
#include <stdbool.h>
#define COLOR_RED 255, 0, 0
#define COLOR_BLUE 0, 0, 255
void showColor(int r, int g, int b)
{
printf("R: %d, G: %d, B: %d\n", r, g, b);
}
int main()
{
showColor(true ? COLOR_RED : COLOR_BLUE);
showColor(false ? COLOR_RED : COLOR_BLUE);
return 0;
}
输出不符合预期:
R: 0, G: 0, B: 255
R: 0, G: 0, B: 255
这是行不通的,因为三元组是运行时而不是编译时。
但与此同时,编译指示扩展的结果似乎不是有效的代码。
为什么这不是编译器错误:
showColor(true ? 255, 0, 0 : 0, 0, 255);
为什么它总是解析为三元的错误表达式?
只是好奇这背后的机制是什么迫使它总是解析三元中的错误表达式。
showColor(true ? 255, 0, 0 : 0, 0, 255);
被解析为
showColor((true ? (255, 0, 0) : 0), 0, 255);
相当于
showColor(0, 0, 255);