我最近遇到了一些看起来像的代码:
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;
因此,在我看来,有问题的编译器确实做了一些非常真实的脑力,因为它引入了一个扩展,它也可以编译在其他编译器上,但具有完全不同的含义。 这是不好的。
需要了解更多c/c++开发分享为什么用两个参数调用sizeof运算符?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
以上就是c/c++开发分享为什么用两个参数调用sizeof运算符?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/979247.html