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

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

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

(其中var是一种类型)

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

搜索谷歌代码,我能够在一些PPC代码中找到这种语法的示例 。

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

编辑:事实certificate,我所看到的 – 以及链接代码 – 都是WindRiver Diab编译器特有的语法:

sizeof (type,int-const):

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

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

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

哇,他们真的超载了sizeof运算符的含义。

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

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

在我看来,它就像一个逗号运算符的简单应用程序,它评估它的第一个参数,抛弃结果,然后计算它的第二个参数。

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

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

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

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

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

重要免责声明:下面的代码是伪代码。 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; 

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