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

时间:2009-06-08 17:37:32

标签: c sizeof

我最近遇到了一些看起来像的代码:

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

(其中var是一种类型)

我很惊讶地看到sizeof运算符似乎有两个参数。快速扫描ISO / ANSI C99标准并没有产生任何秘密。我无法想出任何允许在那里使用逗号的语法。

在搜索Google代码时,我能够在某些PPC代码中找到an example此语法。

这是一些特定于PPC的语法吗?这是什么意思?

编辑:事实证明,我所看到的内容以及链接代码都是WindRiver Diab compiler特定于语法的内容:

  

sizeof (type,int-const):

     

如果int-const为0 sizeof ,则返回类型的字节大小。

     

如果int-const为1 sizeof ,则返回类型的对齐方式。

     

如果int-const为2 sizeof ,则返回指定的整数常量   类型的类型。在中查找“sizeof operator”    Diab C / C ++用户指南表示值。

哇,他们真的超载了sizeof运营商的意思。

EDIT2 :完整文档在此处:http://www.vxdev.com/docs/vx55man/diab5.0ppc/c-additi.htm#3001432

5 个答案:

答案 0 :(得分:9)

在进一步的研究中,我发现这是WindRiver Diab compiler特有的行为。有关详细信息,请参阅问题中的编辑

答案 1 :(得分:3)

它看起来像comma operator的简单应用程序,它评估它的第一个参数,抛弃结果,然后计算它的第二个参数。

在这种情况下,它确定文字2的大小是否为4.“var”部分无关紧要。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

如前所述,正在应用逗号运算符,sizeof返回整数文字的大小。这看起来像是作者的错误,但可能会发生一些险恶的编码。

不评估

sizeof表达式,因此可以将它们用于许多棘手的事情。一个示例是为其他未引用的变量提供引用,而不会使编译器生成任何代码。有关示例,请参阅this article有关创建更好的断言宏的信息。如果内存服务,Alexandrescu还有其他一些在Modern C ++ Design中使用sizeof trickery的例子。这些非显而易见的用法之一是可能的,但不太可能是这样的。

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

答案 4 :(得分:0)

重要免责声明:以下代码为伪代码。 sizeof的参数实际上从未被评估,具有“已执行”的含义,它始终是编译时构造(因此是模板作者首选的工具之一,如枚举)。

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

许多人不知道你可以像这样有效地调用sizeof

auto s = sizeof int;

即,不需要括号。因此,如果将(x,y)传递给sizeof,则相当于

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

或只是

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

x,y是一个序列,其中每个部分从左到右进行评估,序列获取最后一部分的值,在这种情况下,这是y。因此,原始代码大致相当于

auto s = sizeof y;

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