【问题标题】:Using sizeof operator on a typedef-ed struct在 typedef 结构上使用 sizeof 运算符
【发布时间】:2012-10-16 22:55:37
【问题描述】:

这可能太明显了。但是,尽管许多 stackoverflow 线程讨论了这方面的不同方面,但我找不到具体的答案。

typedef struct _tmp {
   unsigned int a;
   unsigned int b;
} tmp;

int main()
{
    int c=10;
    if (c <= sizeof tmp) {
       printf("less\n");
    } else {
       printf("more\n");
    }
    return 0;
}

我将此程序编译为 -

g++ -lstdc++ a.cpp

我收到一个错误 -

expected primary-expression before ‘)’ token

我认为我遗漏了一些非常明显和直截了当的东西。但似乎无法确定它:-/

谢谢!

【问题讨论】:

标签: c++ typedef


【解决方案1】:

5.3.3 Sizeof [expr.sizeof]

1) sizeof 运算符在其操作数的对象表示中产生字节数。操作数是 一个表达式,它是一个未计算的操作数(第 5 条),或一个带括号的 type-id(强调我的)

在您的情况下,它是一个 type-id,因此必须用括号括起来。 8.1 类型名称 [dcl.name] 中描述了什么是 type-id。

sizeof tmp 应该是sizeof (tmp)

if (c &lt;= sizeof tmp) 应该是if (c &lt;= sizeof (tmp))

是的,非常“简单明了”。

【讨论】:

    【解决方案2】:

    sizeof 运算符有两种形式:

    sizeof expression
    sizeof(type)
    

    当你给它一个类型时,你需要括号,sizeof(tmp)

    【讨论】:

    • 但推荐的形式是 sizeof(type)
    • @MarwenBkh 这很主观。我建议您在不需要时不要使用括号,其他人可能会提出其他建议。
    • sizeof 的语法:sizeof( parameter_pack ) (C++11 起)
    • @MarwenBkh 你能澄清你在说什么吗?你是说 C++ 11 只允许 sizeof 带括号?这是不正确的。不过,C++11 为 sizeof 引入了第三种语法 sizeof..( parameter_pack )(请注意,这三个 ... 也是语法的一部分)
    【解决方案3】:

    tmp 周围添加括号:sizeof(tmp)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-21
      • 1970-01-01
      • 1970-01-01
      • 2021-05-06
      • 2012-09-08
      • 1970-01-01
      • 1970-01-01
      • 2017-06-14
      相关资源
      最近更新 更多