我通常不需要帮助理解错误消息,但是这一条看起来一定是个错误。我已经梳理了“可能已经得到答案的问题”,但这些问题似乎都没有使用C11添加的最近的C11特性,所以我认为这可能是一个独特的问题。这是我的测试案例:
#include <stdio.h>
#define foo(bar) _Generic((bar), int: sizeof (bar) \
, int *: sizeof *(bar))
int main(void) {
printf("%d\n", foo(42));
}我看到gcc 5.2的错误信息是:
错误:一元'
*‘的无效类型参数(有'int') 注:在扩展宏“foo”中
clang发出了一个类似意思的信息:
致命错误:间接要求指针操作数('
int‘无效) 注:从宏“foo”扩展
这些信息似乎意味着以下几点之一:
int *泛型关联中选择表达式。C11§6.5.1.1p3似乎明确禁止这两种解释:
不计算泛型选择的控制表达式。如果泛型选择具有与控制表达式的类型兼容的类型名称的泛型关联,则泛型选择的结果表达式是该泛型关联中的表达式。否则,泛型选择的结果表达式是默认泛型关联中的表达式。没有计算泛型选择的任何其他泛型关联的表达式。
有人能为我解释一下这条错误信息吗?
发布于 2015-09-18 06:35:17
编译器是对的:sizeof *(42)是一个约束冲突,因为它将*应用于整数类型的表达式。现在,对于_Generic来说,有一件事很重要,那就是这不是预处理时间,而是作为C语言意义上的适当表达式(具有最高优先级)。这个_Generic表达式的效果实际上与执行以下操作相同
(1 ? sizeof (42) : sizeof *(42))在这里,您知道第二个分支从未被评估过,仍然没有人期望它能够编译。
https://stackoverflow.com/questions/32642677
复制相似问题