为什么这不是 C/C++ 中的编译器错误:#define + 三元函数参数

问题描述 投票:0回答:1

给出以下 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);

为什么它总是解析为三元的错误表达式?

只是好奇这背后的机制是什么迫使它总是解析三元中的错误表达式。

c++ c parameters pragma ternary
1个回答
0
投票
showColor(true ? 255, 0, 0 : 0, 0, 255);

被解析为

showColor((true ? (255, 0, 0) : 0), 0, 255); 

相当于

showColor(0, 0, 255); 
© www.soinside.com 2019 - 2024. All rights reserved.