我最近遇到了一些看起来像这样的代码:
if(sizeof(var,2) == 4) { ... }
(其中
var
是一种类型)
我很惊讶地发现
sizeof
运算符似乎有两个参数。快速浏览一下 ISO/ANSI C99 标准并没有发现任何秘密。我无法想出任何允许在那里使用逗号的语法。
搜索 Google 代码,我在一些 PPC 代码中找到了此语法的示例。
这是 PPC 特定的语法吗?是什么意思?
编辑: 事实证明,我正在查看的内容以及链接的代码都是特定于 WindRiver Diab 编译器的语法:
sizeof(类型,int-const):
如果 int-const 为 0 sizeof 返回类型的大小(以字节为单位)。
如果 int-const 为 1 sizeof 返回类型的对齐方式。
如果 int-const 为 2 sizeof 返回一个整数常量,指定 类型的类型。在中查找“sizeof 运算符” Diab C/C++ 用户指南 了解值。
哇,他们真的超载了
sizeof
运算符的含义。
编辑2:完整文档位于:http://www.vxdev.com/docs/vx55man/diab5.0ppc/c-additi.htm#3001432
经过进一步研究,我发现这是特定于 WindRiver Diab 编译器 的行为。有关详细信息,请参阅问题中的编辑。
看起来像一条红鲱鱼。我的猜测是您不小心使用了逗号运算符,并且 sizeof 被应用于最后一个值。
重要免责声明:下面的代码是伪代码。 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;
所以在我看来,所讨论的编译器确实做了一些非常非常脑残的事情,因为它引入了一个扩展,该扩展也可以在其他编译器上编译,但具有完全不同的含义。这很糟糕。
如前所述,正在应用逗号运算符,并且
sizeof
返回整数文字的大小。乍一看,这看起来像是作者的错误,但可能会发生一些险恶的编码。
sizeof
表达式不会被求值,因此它们可以用于许多棘手的事情。一个示例是为未引用的变量提供引用,而不导致编译器生成任何代码。有关创建更好的断言宏的示例,请参阅这篇文章。如果没记错的话,Alexandrescu 在现代 C++ 设计中还有一些其他 sizeof
诡计的例子。这些不明显的用途之一可能是有意为之的,但可能性不大。
无论用法如何,如果在这种情况下没有注释,那么显然不值得在可读性上进行权衡,应该进行更改。