代码之家  ›  专栏  ›  技术社区  ›  David Citron

为什么用两个参数调用sizeof运算符?

  •  12
  • David Citron  · 技术社区  · 15 年前

    我最近遇到了一些类似的代码:

    if(sizeof(var,2) == 4) { ... }
    

    (何处) var 是一种类型)

    我很惊讶地看到,似乎有两个论点 sizeof 操作员。对ISO/ANSI C99标准的快速扫描并没有产生任何秘密。我想不出任何允许在那里用逗号的语法。

    搜索谷歌代码,我发现 an example 在某些PPC代码中使用这种语法。

    这是PPC特有的语法吗?这是什么意思?

    编辑: 结果发现,我所看到的——以及链接代码——都是特定于 WindRiver Diab compiler :

    西泽 (类型,int const):

    如果int const为0 西泽 返回类型的大小(字节)。

    如果int const为1 西泽 返回类型的对齐方式。

    如果int const为2 西泽 返回指定的整数常量 类型的类型。在中查找“sizeof operator” DIAB/C/C++用户指南 为了价值。

    哇,他们真的把 西泽 操作员。

    编辑2: 完整文档如下: http://www.vxdev.com/docs/vx55man/diab5.0ppc/c-additi.htm#3001432

    5 回复  |  直到 13 年前
        1
  •  9
  •   David Citron    15 年前

    在进一步的研究中,我发现这是特定于 WindRiver Diab compiler . 请看 编辑 关于细节的问题。

        2
  •  3
  •   Rob Kennedy    15 年前

    在我看来,它是 comma operator 它计算第一个参数,丢弃结果,然后计算第二个参数。

    在这种情况下,它决定 2 有4号。“ var “部分无关紧要。

        3
  •  1
  •   JaredPar    15 年前

    看起来像一条红鲱鱼。我猜您不小心使用了逗号运算符,sizeof正在应用于最后一个值。

        4
  •  0
  •   Dan Olson    15 年前

    如前所述,正在应用逗号运算符,size of返回整型文本的大小。这看起来像是作者的一个错误,但可能会有一些邪恶的编码发生。

    不计算sizeof表达式,因此它们可以用于许多棘手的事情。一个例子是在不导致编译器生成任何代码的情况下为其他未引用的变量提供引用。见 this article 关于为示例创建更好的断言宏。如果内存服务的话,Alexandrescu在现代C++设计中还有一些其他的诡计。有可能,但不可能,这些不明显的用法之一是有意的。

    不管它的用法是什么,如果它在这种情况下没有被评论,那么它显然不值得在可读性方面进行权衡,应该进行更改。

        5
  •  0
  •   Sebastian Mach    13 年前

    重要免责声明:下面的代码是伪代码。这个 实际上从未计算sizeof的参数 “已执行”的意思是,它始终是编译时构造(因此也是模板作者首选的工具之一,如枚举)。

    注意我借了 auto 下面从C++(0x);它告诉编译器从初始化器表达式中推断出类型,并使示例更简单。

    很多人不知道的是你可以调用 sizeof 就像这样:

    auto s = sizeof int;
    

    也就是说,不需要括号。因此,如果将(x,y)传递给 西泽 ,相当于

    auto c = (x,y);
    auto s = sizeof c;
    

    或者只是

    auto c = x,y;
    auto s = sizeof c;
    

    x,y 是一个序列,其中每个部分从左到右进行计算,序列获取最后一个部分的值,在本例中,这是 y . 所以,原始代码大致相当于

    auto s = sizeof y;
    

    所以在我看来,有问题的编译器确实做了一些非常,非常愚蠢的事情,因为它引入了一个扩展,也可以在其他编译器上编译,但有着完全不同的含义。这很糟糕。