首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解释`_Generic`错误信息:错误:单元化‘`*’‘(有’type‘’)的无效类型参数

解释`_Generic`错误信息:错误:单元化‘`*’‘(有’type‘’)的无效类型参数
EN

Stack Overflow用户
提问于 2015-09-18 01:58:23
回答 1查看 263关注 0票数 2

我通常不需要帮助理解错误消息,但是这一条看起来一定是个错误。我已经梳理了“可能已经得到答案的问题”,但这些问题似乎都没有使用C11添加的最近的C11特性,所以我认为这可能是一个独特的问题。这是我的测试案例:

代码语言:javascript
复制
#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似乎明确禁止这两种解释:

不计算泛型选择的控制表达式。如果泛型选择具有与控制表达式的类型兼容的类型名称的泛型关联,则泛型选择的结果表达式是该泛型关联中的表达式。否则,泛型选择的结果表达式是默认泛型关联中的表达式。没有计算泛型选择的任何其他泛型关联的表达式。

有人能为我解释一下这条错误信息吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-18 06:35:17

编译器是对的:sizeof *(42)是一个约束冲突,因为它将*应用于整数类型的表达式。现在,对于_Generic来说,有一件事很重要,那就是这不是预处理时间,而是作为C语言意义上的适当表达式(具有最高优先级)。这个_Generic表达式的效果实际上与执行以下操作相同

代码语言:javascript
复制
(1 ? sizeof (42) : sizeof *(42))

在这里,您知道第二个分支从未被评估过,仍然没有人期望它能够编译。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32642677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档