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

问题描述 投票:0回答:5

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

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

c sizeof
5个回答
10
投票

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


3
投票

在我看来,这就像逗号运算符的简单应用,它计算其第一个参数,丢弃结果,然后计算其第二个参数。

在本例中,它正在确定文字

2
的大小是否为4。“
var
”部分是无关紧要的。


1
投票

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


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;

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


0
投票

如前所述,正在应用逗号运算符,并且

sizeof
返回整数文字的大小。乍一看,这看起来像是作者的错误,但可能会发生一些险恶的编码。

sizeof
表达式不会被求值,因此它们可以用于许多棘手的事情。一个示例是为未引用的变量提供引用,而不导致编译器生成任何代码。有关创建更好的断言宏的示例,请参阅这篇文章。如果没记错的话,Alexandrescu 在现代 C++ 设计中还有一些其他
sizeof
诡计的例子。这些不明显的用途之一可能是有意为之的,但可能性不大。

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

© www.soinside.com 2019 - 2024. All rights reserved.